【问题标题】:Find duplicates in arrays of objects and pick one of them comparing their values在对象数组中查找重复项并选择其中一个比较它们的值
【发布时间】:2017-09-15 17:53:13
【问题描述】:
var array1 = [
   {
    "_id" : ObjectId("5972dbe185c5a00906fbefa7"),
    "name" : "user1",
    "score" : 2.0
   },
   {
    "_id" : ObjectId("59994cf90b79bc4e8233ed1d"),
    "name" : "user2",
    "score" : 1.5
   },
   {
    "_id" : ObjectId("59880bbaa329573db1180acd"),
    "name" : "user3",
    "score" : 0.5
   },
   {
    "_id" : ObjectId("5972fa945ad42b149da788b2"),
    "name" : "user4",
    "score" : 3.0
   }
]

var array2 = [
   {
    "_id" : ObjectId("5972dbe185c5a00906fbefa7"),
    "name" : "user1",
    "score" : 1.5
   },
   {
    "_id" : ObjectId("599d2d8fe9feeb290c699535"),
    "name" : "user5",
    "score" : 1.5
   },
   {
    "_id" : ObjectId("59880bbaa329573db1180acd"),
    "name" : "user3",
    "score" : 3.0
   },
   {
    "_id" : ObjectId("8072fa945ad42b149da799cc"),
    "name" : "user8",
    "score" : 2.5
   }
]

array3 = _.unionWith(array1, array2, _.isEqual);

我从两个不同的搜索查询返回了两个用户对象数组,现在可能存在重复的用户对象,我确实使用 lodash 的 ._unionWith 函数删除了重复项,但我未能选择并返回其中一个重复的对象将另一个重复对象 score 添加到要返回的对象的 score 属性中。 我怎样才能以更有效的方式做到这一点。谢谢

【问题讨论】:

  • 发布您的代码将是很好的第一步。
  • 欢迎来到 SO。请访问help center 了解询问内容和方式。提示:发布工作和代码
  • 哦,对不起!由于这是我的第一个问题,我认为我的问题描述足以理解。
  • 你说的“更高效的方式”是什么意思你有哪一种?
  • 是的,您的代码不是真正的代码,而只是两个数组。您忘记将代码发布在您实际尝试执行您要我们做的事情的地方。

标签: javascript arrays lodash


【解决方案1】:

您可以将哈希表作为对象的引用并减少数组。

var array1 = [{ _id: "5972dbe185c5a00906fbefa7", name: "user1", score: 2.0 }, { _id: "59994cf90b79bc4e8233ed1d", name: "user2", score: 1.5 }, { _id: "59880bbaa329573db1180acd", name: "user3", score: 0.5 }, { _id: "5972fa945ad42b149da788b2", name: "user4", score: 3.0 }],
    array2 = [{ _id: "5972dbe185c5a00906fbefa7", name: "user1", score: 1.5 }, { _id: "599d2d8fe9feeb290c699535", name: "user5", score: 1.5 }, { _id: "59880bbaa329573db1180acd", name: "user3", score: 3.0 }, { _id: "8072fa945ad42b149da799cc", name: "user8", score: 2.5 }],
    hash = Object.create(null),
    result = [array1, array2].reduce(function (r, a) {
        a.forEach(function (o) {
            if (!hash[o._id]) {
                hash[o._id] = o;
                r.push(hash[o._id]);
                return;
            }
            hash[o._id].score += o.score;
        });
        return r;
    }, []);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

    【解决方案2】:

    使用循环你可以做这样的事情:

    var array1 = [
       {
        "_id" : "5972dbe185c5a00906fbefa7",
        "name" : "user1",
        "score" : 2.0
       },
       {
        "_id" : "59994cf90b79bc4e8233ed1d",
        "name" : "user2",
        "score" : 1.5
       },
       {
        "_id" : "59880bbaa329573db1180acd",
        "name" : "user3",
        "score" : 0.5
       },
       {
        "_id" : "5972fa945ad42b149da788b2",
        "name" : "user4",
        "score" : 3.0
       }
    ]
    
    var array2 = [
       {
        "_id" : "5972dbe185c5a00906fbefa7",
        "name" : "user1",
        "score" : 1.5
       },
       {
        "_id" : "599d2d8fe9feeb290c699535",
        "name" : "user5",
        "score" : 1.5
       },
       {
        "_id" : "59880bbaa329573db1180acd",
        "name" : "user3",
        "score" : 3.0
       },
       {
        "_id" : "8072fa945ad42b149da799cc",
        "name" : "user8",
        "score" : 2.5
       }
    ]
    
    
    
    array1.forEach((item)=>{
      array2.forEach((item2) => {
        if(item._id === item2._id){
          item2.score = item2.score +item.score;//add score from first array dup to second
        }
      
      });   
      });
    console.log(array2)

    现在 array2 具有 array1 中所有重复项的分数

    注意:我删除了 ObjectId 以使其在 sn-p 中工作

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-15
      • 2016-08-06
      • 1970-01-01
      • 2019-04-06
      相关资源
      最近更新 更多