如何检查两个字符串数组是否包含相同的值(包括重复项)

问题描述 投票:2回答:2

我有两个包含字符串的数组,例如:

a = ['a', 'b', 'a']
b = ['b', 'a', 'a']

我发现我可以使用lodash:

_.isEmpty(_.xor(a,b))

确保他们都平等。 但是,如果我在数组中有重复的值,则此方法似乎失败,例如:

a = ['a', 'b', 'a']
b = ['b', 'a']

上面的方法对于这种情况将返回true(它将打印它们是相等的)虽然我在数组中有2个'a'而在b中只有1个。

有没有优雅的方法来进行这种比较?

node.js
2个回答
1
投票

function isEqual(a, b) {
  return [...new Set(a.concat(b)] // Get an array of unique elements of both arrays
           .filter(t =>
             // Filter on those elements whose count in both arrays is different
             a.filter(at=>at===t).length !==  b.filter(bt=>bt===t).length
            )
           .length === 0
}

console.log(['a','b'], ['b','a','a'], isEqual(['a','b'], ['b','a','a']))
console.log(['a','b','a'], ['b','a','a'], isEqual(['a','b','a'], ['b','a','a']))

0
投票

如果您不想对数组进行排序,我建议以下内容。您获取一个数组并从另一个数组中删除每个项目。如果在任何时候都无法删除某个项目,或者该数组最后仍然包含任何项目,则它们不相等。

var a = ['a', 'b', 'a']
var b = ['b', 'a', 'a']

function areEqual(a, b) {
  var flag = true;
  b.forEach((letter) => {
    let i = a.indexOf(letter);
    if(i == -1) { flag = false; }
    else a.splice(i, 1);
  });
  if(flag && a.length == 0) { return true; }
  else { return false; }
}

console.log(areEqual(a,b));
 
© www.soinside.com 2019 - 2024. All rights reserved.