Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何比较数组中的每个对象。找到时,使用新属性更新对象 例如考虑下面的带有对象的数组。 var collection = [{name:'user1',phone:'203'}, {name:'user2',phone:'5050'}, {name:'user1',phone:'203'}]_Javascript_Reactjs_Underscore.js_Lodash - Fatal编程技术网

Javascript 如何比较数组中的每个对象。找到时,使用新属性更新对象 例如考虑下面的带有对象的数组。 var collection = [{name:'user1',phone:'203'}, {name:'user2',phone:'5050'}, {name:'user1',phone:'203'}]

Javascript 如何比较数组中的每个对象。找到时,使用新属性更新对象 例如考虑下面的带有对象的数组。 var collection = [{name:'user1',phone:'203'}, {name:'user2',phone:'5050'}, {name:'user1',phone:'203'}],javascript,reactjs,underscore.js,lodash,Javascript,Reactjs,Underscore.js,Lodash,现在我想比较每个对象之间的距离,并给出结果 var newCollection = {name:'user1',phone:'203', rowMatch:'true'}, {name:'user2',phone:'5050', rowMatch:'false'}, {name:'user1',phone:'203',rowMatch:'true'} 因此,我想要这样的新集合,当对象属性与第一个和第三个

现在我想比较每个对象之间的距离,并给出结果

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

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

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

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

记录计数。当计数大于1时,您知道您有一个重复(行匹配)


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

})

在这里,您只需使用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)

很简单。这里是JSFIDLE。您的意思是,如果两行或更多行相同,您需要将
rowMatch
设置为true?即使一行与另一行匹配,您也必须使用rowMatch:true更新两个对象。然后他需要返回以将属性分配给以前的项一个简单的concat可能会产生误报。这将始终找到您当前所在的项,需要将其排除。您的“查找”用法已禁用,“查找”不会返回-1如果未找到,它将返回未定义的。@bryan60,是的,现在看到了,返回未定义的
,使用“double not now”。@Rick Jolly不,这不会。您现在可以在编辑的答案中看到工作小提琴。ThanksFind不会让您知道长度。基本逻辑是查找对象的更多迭代。我的错,没有注意到
长度>1
。删除我的评论以避免混淆。谢谢,伙计。如果你已经尝试过,那么请投票。提前谢谢。是的,它可以工作,但更希望看到
item.rowMatch=(条件)
item.rowMatch=(条件)?'true':'false'
如果需要字符串。我也不喜欢过滤器效率低下和直接变异。
collection.forEach((item)=>{
item.rowMatch = (collection.filter((e)=>{return (e.name==item.name&&e.phone==item.phone)}).length>1)?'true':'false';
})
console.log(collection)