【问题标题】:How to compare each object in an array with each other. When found update the object with a new property如何将数组中的每个对象相互比较。找到时使用新属性更新对象
【发布时间】:2017-11-07 17:18:48
【问题描述】:

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

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'}

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

【问题讨论】:

  • 你的意思是如果2行或更多行相同,你需要将rowMatch设置为true?
  • 即使一行与另一行匹配,您也必须使用 rowMatch 更新两个对象:true。

标签: javascript reactjs underscore.js lodash


【解决方案1】:
var newCollection = collection.map(item => {
   item.rowMatch = !!collection.find(i => i !== item && i.phone === item.phone && i.name === item.name);
   return item;
});

在这里,您只是使用 map 来遍历并检查每个项目是否有非原始项目的重复项。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • @Rick Jolly 不,这不会。您现在可以在编辑的答案中看到工作小提琴。谢谢
    • Find不会让你知道长度。基本逻辑是找一个对象的更多迭代。
    • 我的错,没有注意到length > 1。删除了我的 cmets 以避免混淆。
    • 谢谢你。如果你试过了,那就点个赞吧。提前致谢。
    • 是的,它可以工作,但如果需要字符串,宁愿看到item.rowMatch = (condition)item.rowMatch = (condition) ? 'true' : 'false'。不过,我也不喜欢过滤器效率低下和直接突变。
    【解决方案3】:

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

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

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

    JavaScript Hashmap Equivalent

    【讨论】:

    • 那么他需要返回通过将属性分配给上一个项目
    • 一个简单的 concat 可能会产生误报。
    【解决方案4】:

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

    【讨论】:

    • 这将始终找到您当前所在的项目,需要将其排除。并且您的 find 用法已关闭,如果未找到 find 不会返回 -1,它会返回 undefined。
    • @bryan60,是的,现在看到了,返回 undefined,现在不使用 double。
    猜你喜欢
    • 2018-12-30
    • 1970-01-01
    • 2019-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-29
    • 2023-03-18
    • 2019-06-28
    相关资源
    最近更新 更多