如何在对象Array中找到重复属性的组合

时间:2018-03-13 07:54:40

标签: javascript arrays object

我有一个具有多个属性的对象数组。如果数组中的对象已经具有相同的新对象属性值组合,我想在推送另一个对象之前检查。

[ {
  "mobile" : "6014834",
  "cars" : 55,
  "TV" : 123,
  "bottle" : "2897621771 - Hand Unload",
},
{
  "mobile" : "6014834",
  "cars" : 55,
  "TV" : 126,
  "bottle" : "2897621771 - Hand Unload",
},
{
  "mobile" : "6014834",
  "cars" :33,
  "TV" : 26,
  "bottle" : "2897621771 - Hand Unload",
} ]

必须推送的新对象

 {
      "mobile" : "6013456",
      "cars" :33,
      "TV" : 26,
      "bottle" : "Dummy",
    }

我想检查新车的电视和电视的组合是否已经存在于阵列车+电视应始终是唯一的,我不想推。因此,如果对象是

,则不应推送上述对象
{
  "mobile" : "6014834",
  "cars" :33,
  "TV" : 29,
  "bottle" : "2897621771 - Hand Unload",
}

然后就可以推了。

我该怎么检查?

4 个答案:

答案 0 :(得分:0)

您可以尝试这样的事情

var carObj =    [ {
 "mobile" : "6014834",
 "cars" : 55,
 "TV" : 123,
 "bottle" : "2897621771 - Hand Unload",
},
{
  "mobile" : "6014834",
  "cars" : 55,
  "TV" : 126,
  "bottle" : "2897621771 - Hand Unload",
},
{
  "mobile" : "6014834",
  "cars" :33,
  "TV" : 26,
  "bottle" : "2897621771 - Hand Unload",
 } 
]

carObj.forEach(function(entry) {
   if (entry.cars != 33 && entry.TV != 26) {

   }
});

答案 1 :(得分:0)

<强>首先

您需要扩展默认数组方法,如下所示,它将根据tvcars字段检查重复项:

Array.prototype.contains = function ( needle ) {
   for (i in this) {
       if (this[i].cars === needle.cars 
           && this[i].TV === needle.TV) {
         return true;
       }
   }
   return false;
}

<强>第二

在每次插入对象之前,需要检查对象是否存在于数组中(如果不存在),然后添加,以下代码部分执行此操作:

if(!arrayObj.contains(insertObj)) {
  arrayObj.push(insertObj);

}

请使用以下代码:

var arrayObj = [{
  "mobile" : "6014834",
  "cars" : 55,
  "TV" : 123,
  "bottle" : "2897621771 - Hand Unload",
},
{
  "mobile" : "6014834",
  "cars" : 55,
  "TV" : 126,
  "bottle" : "2897621771 - Hand Unload",
},
{
  "mobile" : "6014834",
  "cars" :33,
  "TV" : 26,
  "bottle" : "2897621771 - Hand Unload",
} ];
Array.prototype.contains = function ( needle ) {
   for (i in this) {
       if (this[i].cars === needle.cars 
           && this[i].TV === needle.TV) {
         return true;
       }
   }
   return false;
}

var insertObj = {"mobile" : "6014834","cars" :33,"TV" : 26,"bottle" : "2897621771 - Hand Unload"};
if(!arrayObj.contains(insertObj)) {
  arrayObj.push(insertObj);
  
}

console.log(arrayObj);

答案 2 :(得分:0)

您可以使用_(Underscore)库来解决此类问题。它有一个叫做where的方法。此方法在集合中搜索指定的键值对,如果参数匹配,则将它们返回到数组中。 你可以像这样调用这个方法。

让我们说你的新对象是newObject。

var newObject = {
"mobile":someValue,
"cars":someValue2,
"TV":someValue3,
"bottle":someValue4
};

 if(_.where(carsAndTvs,{"cars":newObject.cars,"TV":newObject.TV}).length >0){
   //push object into array
   }

您可以阅读有关此方法的更多信息

http://underscorejs.org/#where

答案 3 :(得分:0)

let coinciding = arr.findIndex(oldObj => {

     let keys = Object.keys(oldObj);    // property names in the oldObj

       // count how many properties have the same value:
     let propsEqual = keys.reduce((prev, key) => {
         return prev += (oldObj[key] === newObject[key] ? 1 : 0)
     }, 0);

     return propsEqual == keys.length;        
})

重合将是具有相同属性的对象的旧数组中的索引。如果没有巧合,它将为-1。