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

如何在Javascript中比较字符串数组?,javascript,arrays,compare,string-comparison,Javascript,Arrays,Compare,String Comparison,我想看看两个字符串数组是否相等 例如: 比较([“abc”,“def”],[“def”,“abc”]) 应返回true,类似地 compare(["abc", "def"], ["def", "ghi"]) 应返回false 最好的方法是什么?JavaScript没有一个集合或多集合的数据结构(至少没有一个具有广泛的浏览器支持),这是您通常用来测试两组项目是否相同(无论顺序如何)。因此,我建议对数组进行排序并检查它们的内容是否相等。如果您知道数组仅包含字符串,则可以使用简单的等式检查项目:

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

例如:

比较([“abc”,“def”],[“def”,“abc”])

应返回
true
,类似地

compare(["abc", "def"], ["def", "ghi"]) 
应返回
false


最好的方法是什么?

JavaScript没有一个集合或多集合的数据结构(至少没有一个具有广泛的浏览器支持),这是您通常用来测试两组项目是否相同(无论顺序如何)。因此,我建议对数组进行排序并检查它们的内容是否相等。如果您知道数组仅包含字符串,则可以使用简单的等式检查项目:

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
函数比较(array1,array2){
if(array1.length!=array2.length){
返回false;
}
array1=array1.slice();
array1.sort();
array2=array2.slice();
array2.sort();
对于(变量i=0;i
对于更一般的情况,您需要一个更复杂的等式定义,我建议您浏览以下内容的答案。

Naive algorithm:O(N^2)

函数比较(array1,array2){
对于(变量i=0;i
更好的一个:(使用排序,O(NLOGN))

函数比较(array1,array2){
array1.sort();
array2.sort();
对于(变量i=0;i
统一解决方案:

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'
功能比较(a、b){
var isEqual=假;
if(Array.isArray(a)&&Array.isArray(b)&&a.length==b.length){
a、 排序();
b、 排序();
var i;
对于(i=0;i

功能比较(arr1、arr2){
var匹配=真
如果(arr1.length!=arr2.length){
匹配=错误
}
arr1=arr1.slice();
arr1.sort();
arr2.slice();
arr2.sort();
对于(变量i=0;i
我建议遵循ES6 oneliner

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

  • 请提供您尝试执行此操作的代码对数组进行排序并将a[n]与b[n]进行比较,或者跳过排序并在b的每个位置查找a[n]。如果(array1[I]!=array2[I]){return false;}
    中的逻辑可能重复,我认为您有问题。你不知道;如果找不到匹配项,您不想中断,您应该继续查找匹配项。看起来,如果它们包含相同的项,即使顺序不同,也必须将它们视为相等。这不能通过你的检查。将是一个n^2迭代。。。或者在实现时需要排序。谢谢您的回答。这是最有效的方法吗?JS没有任何内置函数用于此操作吗?我想我已经回答了您的评论。我最初误解了这个问题,并期望数组完全相等。现在我使用与Culme相同的方法对数组进行排序。Abhijith:我通常使用这种方法。在极端情况下,我会将
    array1
    中的所有项作为键放在一个对象中(JavaScript最接近于一个设置的数据结构),以在迭代
    array2
    时获得固定时间的查找,但我几乎不需要这样做。这对于
    a1=['foo','foo']
    a2=['foo','bar']都会返回true@StephenHarris谢谢!我应用了
    Set
    转换来解决重复的情况。这两种方法都需要
    if(array1.length!==array2.length){return false}
    才能在一开始工作。对于原语来说非常酷,但要注意许多陷阱
    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'
    
    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
    
    const compare = (a1, a2) =>
      (a1 = new Set(a1)) &&
      (a2 = new Set(a2)) &&
      a1.size === a2.size &&
      [...a1].every(v => a2.has(v));
    
    JSON.stringify(array1.sort()) === JSON.stringify(array2.sort())