从数组中获取不在第一个对象数组中的元素

时间:2016-07-16 18:29:00

标签: javascript jquery

enter image description here我在javascript中有两个对象数组

var arr1 = [{'a':'1'},{'b':'2'},{'c':'3'}];
var arr2 = [{'a':'1'},{'b':'2'},{'d':'4'}];

我想从arr2获取不在arr1中的元素。 我的输出将是[{'d':'4'}]

3 个答案:

答案 0 :(得分:1)

我想到的最简单的方法是使用JSON.stringify:

var arr1 = [{'a':'1'},{'b':'2'},{'c':'3'}];
var arr2 = [{'a':'1'},{'b':'2'},{'d':'4'}];

stringArr1 = JSON.stringify(arr1);
var result = arr2.filter(
  obj => !~stringArr1.indexOf(JSON.stringify(obj))
);

console.log(result);

但应该有更好的方法。

相当于:

var result = arr2.filter(
  obj => !~stringArr1.indexOf(JSON.stringify(obj))
);

是常见的:

var result = arr2.filter(function (obj) {
  var stringObj = JSON.stringify(obj);
  if (stringArr1.indexOf(stringObj) != -1)
    return true;
  else
    return false;
});

技巧很简单,基本上你需要知道3件事:

  1. 所有非零数字均为真。 SO link.
  2. 按位not(~)将-1变为0. MDN link.
  3. 内联箭头函数(=>)不需要return个关键字。 MDN link.
  4. 希望有所帮助:)

答案 1 :(得分:0)

您可以使用scanf()$.grep().every()

Object.keys()
var arr1 = [{'a':'1'},{'b':'2'},{'c':'3'}];
var arr2 = [{'a':'1'},{'b':'2'},{'d':'4'}];
var res = $.grep(arr2, function(v) {
             return arr1.every(function(_v) {
               var keys = [Object.keys(v)[0], Object.keys(_v)[0]];
               return keys[0] !== keys[1] && v[keys[0]] !== _v[keys[1]]
             })
          });
console.log(res)

答案 2 :(得分:0)

您可以对数组的每个元素使用JSON.stringify,并使用哈希表进行检查



var arr1 = [{ 'a': '1' }, { 'b': '2' }, { 'c': '3' }],
    arr2 = [{ 'a': '1' }, { 'b': '2' }, { 'd': '4' }],
    arr3,
    hash = Object.create(null);

arr1.forEach(function (o) {
    hash[JSON.stringify(o)] = true;
});

arr3 = arr2.filter(function (o) {
    return !hash[JSON.stringify(o)];
});

console.log(arr3);