【问题标题】:compare 2 array and find unique differences [closed]比较2个数组并找到独特的差异[关闭]
【发布时间】:2015-03-10 14:53:52
【问题描述】:

假设我们有两个数组

var firstArray = [{"id":1},{"id":3},{"id":5}]
var secondArray = [{"id":1},{"id":2},{"id":3},{"id":4}]
var missingValues = [];

for(var i=0; i < firstArray.length; i++) {
  for(var j=0; j < secondArray.length; j++) {
      if(firstArray[i].id === secondArray[j].id) {
         //do something if I have the same id
      } else {
        missingValues.push(secondArray[j].id); // it should have unique values
      }
  }
}

for(var i = 0; i < missingValues.length; i++) {
  //compare first array and missigValues and remove the same elements
}

我想得到以下结果。这意味着我需要比较两个数组并删除所有不在第二个数组中的对象,但我还需要保持相同的顺序

firstArray = [{"id":1},{"id":2},{"id":3},{"id":4]

有没有更好的方法来做到这一点?由于这些数组内部可能包含大量 JSON 数据,因此性能更明智。 我想尽可能避免多重嵌套。

【问题讨论】:

  • 您能说明一下您需要做什么吗?
  • 你的输出真的应该包含{id: 2}吗?如果是这样,看起来您需要做的只是对第二个数组进行某种克隆。
  • 你确定你提到的结果数组是正确的吗?
  • 也许我在这里遗漏了一些东西,但您的示例使您看起来只需将 firstArray 替换为 secondArray。如果您只想从firstArray 中删除secondArray 中没有的内容,您所需的输出应NOT 包含24
  • 您的示例 still 似乎允许返回第二个数组或克隆。这真的是你想要的吗?你的话似乎表达了不同的意思。

标签: javascript arrays json performance knockout.js


【解决方案1】:

您可以使用临时原始数组来防止缓慢的用户级嵌套循环:

var firstArray = [{"id":1},{"id":3},{"id":5}]
var secondArray = [{"id":1},{"id":2},{"id":3},{"id":4}]

var temp=secondArray.map(function(o){return o.id;});

var common=firstArray.filter(function(a){
 return temp.indexOf(a.id)!==-1;
});

JSON.stringify(common) // [{"id":1},{"id":3}]

这种方法假定 id 是唯一用来建立唯一性的重要值,但它非常快。

如果 id 总是一个数字,否则你将永远不会有有意义的情况(例如 {id:1} 与 {id:"1"},你可以使它成为偶数通过使用对象键来建立唯一性更快:

var firstArray = [{"id":1},{"id":3},{"id":5}]
var secondArray = [{"id":1},{"id":2},{"id":3},{"id":4}]

var temp={};
 secondArray.forEach(function(o){temp[o.id]=1; });

var common=firstArray.filter(function(a){
 return temp[a.id]; //note no nested operation at all!
});

JSON.stringify(common) // [{"id":1},{"id":3}]

【讨论】:

    【解决方案2】:

    这是一个与我理解的文本描述相匹配的答案,但不是(当前)示例。可能不正确:

    var firstArray = [{"id":1},{"id":3},{"id":5}]
    var secondArray = [{"id":1},{"id":2},{"id":3},{"id":4}]
    
    var foundIn = function(list) {
        var ids = list.reduce(function(ids, item) {ids[item.id] = 1; return ids;}, {});
        return function(item) {return !!ids[item.id];};
    };
    
    var result = firstArray.filter(foundIn(secondArray)); //=> [{"id":1},{"id":3}]
    

    如果你想用这个做一个完全可重用的函数,你可以添加

    var onlyFoundIn = function(list1, list2) {return list1.filter(foundIn(list2));};
    

    然后

    onlyFoundIn(firstArray, secondArray); //=>  [{"id":1},{"id":3}]
    

    但目前还不清楚这是否真的达到了你想要的效果。

    【讨论】:

      猜你喜欢
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多