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)