当前位置: 首页 > 知识库问答 >
问题:

比较javascript中顺序不重要的数组

储承
2023-03-14

我正在学习Javascript,我在SO上看到了一个比较数组以检查它们是否相同的函数。但是,如果两个数组是[string1,string2],我的当前函数将返回false

function _compareArrays(arr1,arr2){
    var result = arr1 != null && arr2 != null && arr1.length == arr2.length && arr1.every(function(element) {
            return arr2.indexOf(element);
        });
    return result ;
}

然而,我希望这两个数组以相同的方式返回。所以,我更改了<code>。每个到。indexOf()</code>,它似乎有效。但是,我有一个疑问,这里计数器究竟是如何递增的,以确保对每个元素都进行了比较?我的意思是,在C语言中,

for (int i = 0; i < 10; i++)
    if (arr1[i] == arr2[i]
      cout<<"Elements are same\n";

在这里,我有一个显式的i,它增加计数器。它是如何在上面的函数中发生的?

谢谢!


共有3个答案

丌官玺
2023-03-14

因此,最快的方法是对两个数组进行排序,然后逐个元素比较每个数组。这需要 2n * log(n) n 次而不是n 2 次。

function compareArrays(arr1, arr2){
  if(arr1.length !== arr2.length) return false;

  // implement custom sort if necessary
  arr1.sort();
  arr2.sort();

  // use normal for loop so we can return immediately if not equal
  for(let i=0; i<arr1.length; i++){
    if(arr1[i] !== arr2[i]) return false;
  }

  return true;
}

国景铄
2023-03-14

您的当前存在以下问题:

> 对于这 2 个

  • 数组,它将返回 true(我希望您了解这不是特定于这 2 个数组):[1, 2, 2], [1,1,2]。这个问题就是我在下面的解决方案中将索引设置为未定义的原因。

    indexOf返回-1找不到的元素,以及任何数字

    请参阅关于Bitwise Not运算符(~)的MDN页面,以及它如何解决我提到的indexOf问题。

    我还建议你看看我关于真实/虚假值以及它们如何与交互的这个答案

    所以试试这个(这主要是你的例子,除了没有使用的indexOf,我修复了问题#2):

    js lang-js prettyprint-override">function _compareArrays(arr1,arr2){
      if(!(arr1 != null && arr2 != null && arr1.length == arr2.length)) {
        return false;
      }
    
      /* copy the arrays so that the original arrays are not affected when we set the indices to "undefined" */
      arr1 = [].concat(arr1);
      arr2 = [].concat(arr2);
    
      return arr1.every(function(element, index) {
        return arr2.some(function(e, i) {
          return e === element && (arr2[i] = undefined, true);
        });
      });
    }
        
    var x = ["str", "boo", "str"];
    var y = ["boo", "str", "str"];
    var z = ["abc", "def", "ghi"]    
    
    console.log(_compareArrays(x, y));
    console.log(_compareArrays(x, z));
    console.log(_compareArrays(z, z));

  • 鲜于阳成
    2023-03-14

    请将数组转换为对象。将数组值转换为键,并将它们各自的计数作为它们的值。由于只对数组迭代一次,所以这样做更有效率。

    function compare(a, b) {
      if (a.length !== b.length) {
        return false;
      }
      let set = {};
      a.forEach((i) => {
        if (set[i] !== undefined) {
          set[i]++;
        } else {
          set[i] = 1;
        }
      });
      let difference = b.every((i) => {
        if (set[i] === undefined) {
          return false;
        } else {
          set[i]--;
          if (set[i] === 0) {
            delete set[i];
          }
          return true;
        }
      });
      return Object.keys(set) == 0 && difference;
    }
    

    第一个数组上的第一个循环初始化集合(对象),第二个数组上的第二个循环减去计数并在计数达到0时删除键。如果未找到键或在过程结束时集合不为空,则数组不相似。

     类似资料:
    • 我有两个列表,数据相同,但顺序不同。 结果:

    • 问题内容: 原始问题: 当我的JavaScript调用的功能在页面下方而不是在调用页面的下方定义时,JSHint会抱怨。但是,我的页面是用于游戏的,在下载全部内容之前,不会调用任何函数。那么为什么订单功能出现在我的代码中很重要? 我在里面吟。看来我需要花另一天的时间才能重新排序六千行代码。使用javascript的学习曲线一点也不陡峭,但是非常糟糕。 问题答案: tl; dr 如果在加载完成之前不

    • 本文向大家介绍JavaScript 数组比较,包括了JavaScript 数组比较的使用技巧和注意事项,需要的朋友参考一下 示例 为了进行简单的数组比较,您可以使用JSON stringify并比较输出字符串: 注意:这仅在两个对象都可以JSON序列化并且不包含循环引用的情况下起作用。可能会抛出TypeError: Converting circular structure to JSON 您可以

    • 问题内容: 我想比较JavaScript代码中2个对象数组。这些对象共有8个属性,但是每个对象都不会有一个值,并且每个数组的大小永远都不能超过8个,因此可能要使用遍历每个对象然后查看对象的值的蛮力方法。 8个属性是执行我想做的最简单的方法,但是在实现之前,我想看看是否有人有一个更优雅的解决方案。有什么想法吗? 问题答案: 编辑:您不能在JavaScript解释器的当前基于浏览器的常见实现中重载运算

    • 我需要比较使用自定义差异侦听器忽略子节点序列和属性列表序列的2个XML: 我的代码适用于: 我找到了一个临时的解决方案(8小时内不能在我自己的问题上添加评论): 我之前用:ElementNameAndAttributeQualifier重写了ElementQualifier,如果我将其更改为RecursiveElementNameAndTextQualifier,我可以得到我想要的结果 还可以使用

    • null 但是,如果清单2为应该返回false(因为字符串d出现的顺序混乱)