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

时间:2018-03-04 15:45:09

标签: node.js

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

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个。

执行此比较的任何优雅方式?

2 个答案:

答案 0 :(得分: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']))

答案 1 :(得分: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));