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

IT技术 javascript reactjs underscore.js lodash
2021-05-12 09:23:49

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

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个回答
var newCollection = collection.map(item => {
   item.rowMatch = !!collection.find(i => i !== item && i.phone === item.phone && i.name === item.name);
   return item;
});

在这里,您只是使用 map 进行迭代并检查每个项目是否有不是原始项目的重复项。

您可以像这样使用 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/

为您的对象类型创建一个哈希函数。

在这种情况下,字段的简单串联似乎有效。遍历您的集合并对每个元素进行哈希处理,然后将其放入表中。

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

JavaScript Hashmap 等价物

利用 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; 

})