获取另一个数组中不存在的JSON对象

时间:2017-12-14 11:41:18

标签: javascript jquery html web lodash

我有两个数组。

array1 = [
 {'id':1},
 {'id': 2}
]

array2 = [
 {'idVal':1},
 {'idVal': 2},
 {'idVal': 3},
 {'idVal': 4}
]

我需要一种最佳方式,如果可能的话,我可以比较这两个数组,并获得一个结果数组,其中array2而不是array1中存在对象。两个数组中的键具有不同的名称。结果将是,

res = [
  {'idVal': 3},
  {'idVal': 4}
]

5 个答案:

答案 0 :(得分:5)

使用_.differenceWith()和比较器方法。根据关于_.difference()的文档(差异基于差异):

  

创建一个未包含在另一个给定的数组值中的数组   使用SameValueZero进行相等比较的数组。订单和   结果值的引用由第一个数组确定。

所以array2应该是传递给方法的第一个参数。



var array1 = [
  {'id': 1},
  {'id': 2}
];

var array2 = [
  {'idVal': 1},
  {'idVal': 2},
  {'idVal': 3},
  {'idVal': 4}
];

var result = _.differenceWith(array2, array1, function(arrVal, othVal) {
  return arrVal.idVal === othVal.id;
});

console.log(result);

<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
&#13;
&#13;
&#13;

答案 1 :(得分:1)

使用ES6

const result = array2.filter(item => !array1.find(i => i.idVal === item.id))

答案 2 :(得分:0)

&#13;
&#13;
var array1 = [
 {'id':1},
 {'id': 2},
 {'id': 3},
 {'id': 4}
]

var array2 = [
 {'id':1},
 {'id': 3},
 {'id': 4}
]

notInArray2 = array1.reduce( function(acc, v) {
  if(!array2.find(function (vInner) {
    return v.id === vInner.id;
  })){
    acc.push(v);
  }
  return acc
}, []);

console.log(JSON.stringify(notInArray2))
&#13;
&#13;
&#13;

答案 3 :(得分:0)

这是一个优化的解决方案,但不是使用lodash。我创建了一个仅包含array1值的搜索索引,以便您可以在O(1)中查找元素,而不是浏览array1中每个元素的整个array2

m的大小为array1n的大小为array2。此解决方案将在O(m+n)中运行,而不是您之前没有事先编制索引的O(m*n)

&#13;
&#13;
const array1 = [
 {'id':1},
 {'id': 2}
];

const array2 = [
 {'idVal':1},
 {'idVal': 2},
 {'idVal': 3},
 {'idVal': 4}
];

const array1ValuesIndex = {};
array1.forEach(entry => array1ValuesIndex[entry.id] = true);

const result = array2.filter(entry => !array1ValuesIndex[entry.idVal]);
console.log(result);
&#13;
&#13;
&#13;

答案 4 :(得分:0)

array1 = [
 {'id':1},
 {'id': 2}
]

array2 = [
 {'idVal':1},
 {'idVal': 2},
 {'idVal': 3},
 {'idVal': 4}
]

var array1Keys=array1.map(function(d1){ return d1.id});

var result =array2.filter(function(d){ return array1Keys.indexOf(d.idVal)==-1 })
console.log(result);