如何将数组中的每个对象相互比较。发现时使用新属性更新对象

时间:2017-11-07 17:18:48

标签: javascript reactjs underscore.js lodash

例如,考虑以下带对象的数组。

var collection = [{name:'user1',phone:'203'},
                  {name:'user2',phone:'5050'},
                  {name:'user1',phone:'203'}]

现在我想将每个对象相互比较并将结果显示为。

var newCollection =   {name:'user1',phone:'203', rowMatch:'true'},
                      {name:'user2',phone:'5050', rowMatch:'false'},
                      {name:'user1',phone:'203',rowMatch:'true'}

所以,我想要这样的新集合,当对象属性与第一个和第三个对象匹配时,它会与新属性进行比较和更新。

4 个答案:

答案 0 :(得分:1)

var newCollection = collection.map(item => {
   item.rowMatch = !!collection.find(i => i !== item && i.phone === item.phone && i.name === item.name);
   return item;
});

在这里,您只需使用地图进行迭代,并检查每个项目是否包含与原始文件不同的副本。

答案 1 :(得分:0)

为对象类型创建哈希函数。

在这种情况下,字段的简单连接似乎有效。迭代你的集合和每个元素,哈希,然后把它放在一个表中。

跟踪计数。当计数大于1时,您知道您有重复(行匹配)

JavaScript Hashmap Equivalent

答案 2 :(得分:0)

使用Array.prototype.find

var newCollection = collection.map((row, index) => {
       if(row["rowMatch"])
          return row; 

      rowMatch = !!collection.find((r,i) => i !== index && r.name === row.name && r.phone === row.phone); 
      row["rowMatch"] = rowMatch;

      return row; 

})

答案 3 :(得分:0)

你可以像这样使用newCollection或在集合中操作

collection.forEach((item)=>{
item.rowMatch = (collection.filter((e)=>{return (e.name==item.name&&e.phone==item.phone)}).length>1)?'true':'false';
})
console.log(collection)

简单就是这个。这里正在为JSFiddle工作https://jsfiddle.net/touqeer/pgdsw9Le/1/