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

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

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

例如:

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

应该返回true和类似的,

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

应该返回false

做这个的最好方式是什么?

javascript arrays compare string-comparison
5个回答
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的答案。


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;  
}

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/


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

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. 通过将数组转换为集合来删除重复项(对于compare(['a', 'a'], ['a', 'b']),应返回false)。
  2. 长度比较(对于compare(['a', 'b'], ['a', 'b', 'c'])应返回false)。
  3. 检查第二组中是否存在第一个设定项目。
© www.soinside.com 2019 - 2024. All rights reserved.