如何比较Javascript中的字符串数组?

时间:2016-01-22 07:25:24

标签: javascript arrays compare string-comparison

我想看看两个字符串数组是否相等。

例如:

compare(["abc", "def"], ["def", "abc"])

应该返回true,同样地,

compare(["abc", "def"], ["def", "ghi"]) 

应该返回false

这样做的最佳方式是什么?

6 个答案:

答案 0 :(得分:3)

JavaScript没有Set或Multiset数据结构(至少不是具有广泛浏览器支持的数据结构),这是您通常用于测试两组项目是否相同的,无论订购。所以我建议对数组进行排序并检查它们的内容是否相等。如果您知道数组只包含字符串,则可以使用简单的相等性检查项目:

function compare(array1, array2) {
  if (array1.length != array2.length) {
    return false;
  }

  array1 = array1.slice();
  array1.sort();
  array2 = array2.slice();
  array2.sort();

  for (var i = 0; i < array1.length; i++) {
    if (array1[i] != array2[i]) {
      return false;
    }
  }

  return true;
}

console.log(compare(["abc", "def"], ["def", "abc"])); // true
console.log(compare(["abc", "def"], ["def", "ghi"])); // false

对于更一般的情况,您需要更复杂的平等定义,我建议浏览this question的答案。

答案 1 :(得分:2)

朴素算法:O(N ^ 2)

function compare(array1, array2){
  for (var i = 0; i < array1.length; i++){
    if (array2.indexOf(array1[i]) < 0) return false;
  }
  return true;  
}

更好的一个:(使用排序,O(NLOGN))

function compare(array1, array2){
  array1.sort();
  array2.sort();
  for (var i = 0; i < array1.length; i++){
    if (array1[i] !== array2[i]) return false;
  }
  return true;  
}

答案 2 :(得分:0)

统一解决方案:

function compare(a, b){
      var isEqual = false;  
      if (Array.isArray(a) && Array.isArray(b) && a.length == b.length){
          a.sort();
          b.sort();
          var i;
          for (i = 0; i < arr1.length; i++){
              if (a[i] === b[i]){
                  isEqual = true;
              } else{
                  isEqual = false;
                  break;
              }
          }

      }
      return isEqual;
}

var arr1 = ["def", "abc"], arr2 = ["abc", "def"];
console.log(compare(arr2,arr1)); // gives 'true'

console.log(compare(["abc", "def"], ["def", "ghi"])); // gives 'false'

https://jsfiddle.net/ob7e5ye5/4/

答案 3 :(得分:0)

function compare(arr1, arr2){
    var match = true
    if(arr1.length != arr2.length){
        match = false
    }
    arr1 = arr1.slice();
    arr1.sort();
    arr2.slice();
    arr2.sort();
    for(var i = 0; i < arr1.length; i++){
        if(arr1[i] != arr2[i]){
            match = false;
        }
    }
    return match;
}

console.log(compare(["abc", "def"], ["def", "abc"])); // it will return true
console.log(compare(["abc", "def"], ["def", "ghi"])); // it will return false

答案 4 :(得分:0)

我建议遵循ES6-oneliner

const compare = (a1, a2) =>
  (a1 = new Set(a1)) &&
  (a2 = new Set(a2)) &&
  a1.size === a2.size &&
  [...a1].every(v => a2.has(v));
  1. 通过将数组转换为Set来删除重复项(对于compare(['a', 'a'], ['a', 'b'])应该返回false)。
  2. 长度比较(对于compare(['a', 'b'], ['a', 'b', 'c']),应返回false)。
  3. 检查第二套中是否存在第一套项目。

答案 5 :(得分:0)

JSON.stringify(array1.sort()) === JSON.stringify(array2.sort())