如何比较一个过滤器的两个对象数组

时间:2020-04-04 19:45:08

标签: javascript

我想比较两个数组obj 用于过滤器 如何使用与另一个数组obj的对象严格不同的对象过滤数组?

  var y = [

     {  nb :'rouge',
        xb :'rouge',
        x  : 12 },

       { nb :'red',
         xb :'rouge',
         x  : 12 }
     ]
     ,

  var   x = [

       {  nb :'rouge',
          xb : 'rouge',
           x : 12,
       },

       {  nb :'red',
          xb : 'rouge',
          x  : 12,
       },

       {  nb :'violet',
          xb : 'violet',
          x  : 12,
        },

]

  const dispo = x.filter( x !== y );
  console.log(dispo)

预期结果:

[{nb:紫罗兰色, xb:“紫色”, x:12}

]

2 个答案:

答案 0 :(得分:1)

您将需要按值比较对象。您可以使用lodash的_.isEqual或_.isEqualDeep之类的东西。没有lodash的简单方法是这样的:

function compare(a, b) 
{
  if (Object.keys(a).length !== Object.keys(b).length) {
    return false;
  }

  for (let p of Object.keys(a)) {
  
    if (!b.hasOwnProperty(p)) {
      return false;
    }
    
    if (a[p] !== b[p]) {
      return false
    }
    
  }
  
  return true;
}

function includesObj(array, obj) 
{
  for (let el of array) {
    if (compare(obj, el)) {
      return true;
    }
  }
  
  return false;
}  

console.log(x.filter(el => !includesObj(y, el)));

这不会做深入的比较。仅当您的对象的值是基元(而不是数组,函数,其他对象)时才起作用。但您的情况也可以。

答案 1 :(得分:0)

您不能简单地在javascript中比较两个对象,因为会比较引用而不是此对象的值。

您可以检查此链接以了解以下信息:

https://medium.com/javascript-in-plain-english/comparing-objects-in-javascript-ce2dc1f3de7f

如果您更喜欢简单而不是复杂,并且放入数组中的对象并不复杂,则可以尝试Json.stringify(),它会将您的对象转换为字符串,从而易于比较。

请注意,在下一个示例中,我更改了数组的顺序和可读性的名称。

var firstArray = [
  {
    nb: 'rouge',
    xb: 'rouge',
    x: 12,
  },

  {
    nb: 'red',
    xb: 'rouge',
    x: 12,
  },

  {
    nb: 'violet',
    xb: 'violet',
    x: 12,
  },
];

var secondArray = [
  {
    nb: 'rouge',
    xb: 'rouge',
    x: 12
  },

  {
    nb: 'red',
    xb: 'rouge',
    x: 12
  }
];

function difference(firstArray, secondArray) {
  return firstArray.filter(firstArrayElement => {
    return !isContainedInSecondArray(firstArrayElement, secondArray);
  });
}

function isContainedInSecondArray(firstArrayElement, secondArray) {
  return secondArray.find(secondArrayElement => {
    if (JSON.stringify(firstArrayElement) == JSON.stringify(secondArrayElement)) {
      return true;
    }
  });
}

//prints [ { nb: 'violet', xb: 'violet', x: 12 } ]
console.log(difference(firstArray, secondArray));
//prints []
console.log(difference(secondArray, firstArray));