【问题标题】:How to merge javascript objects according to key?如何根据键合并javascript对象?
【发布时间】:2016-04-20 07:47:34
【问题描述】:

我有一个对象数组如下:

[ { user: 'Abc', badge: [ 6 ] },
  { user: 'PQR', badge: [ 7 ] },
  { user: 'PQR', badge: [ 1 ] },
  { user: 'PQR', badge: [ 2 ] },
  { user: 'XYZ', badge: [ -5 ] } ]

我使用以下 javascript 代码创建了这个对象:

        for (var j = 0; j < aR.length; j++) 
    {
        if (typeof aR[j] != 'undefined' && aR[j] != null)
       {

                    recievedUser =aR[j].get("receiver").id;
                    badge = aR[j].get("rBTypes");

                    if(recievedUser!= undefined && badge != undefined )
                    result.push({'user': recievedUser, 'badge': badge});
       }
    }

现在我想像这样合并这个数组:

[     { user: 'Abc', badge: [ 6 ] },
      { user: 'PQR', badge: [ 7 ,1,2] },
      { user: 'XYZ', badge: [ -5 ] } ]

我该怎么做?

我也想找到拥有最多徽章的用户?

【问题讨论】:

  • 提示:将结果重组为{ Abc: [6], PQR: [7,1,2], ... }
  • 这对我来说没问题!
  • { user: 'PQR', badge: [ 7 ],[1],[2] } 不是有效的对象字面量

标签: javascript object merge associative-array


【解决方案1】:

首先,如果您想完成问题 cmets 中提到的琐碎重组结果。只需将代码中的 push 语句更改为:result.push({recievedUser: badge});

现在计算哪个用户拥有最多徽章:

// Add these variables here
var most_badges = 0;
var user_with_most;

for (var j = 0; j < attendeeReflections.length; j++) 
{
    if (typeof attendeeReflections[j] != 'undefined' && attendeeReflections[j] != null)
     {
         recievedUser =attendeeReflections[j].get("receiver").id;
         badge = attendeeReflections[j].get("requestedBehaviorTypes");

         // Add this check here
         if(badge.length > most_badges) {
            most_badges = badge.length;
            user_with_most = recievedUser;
         }
         // Now you have your results

         if(recievedUser!= undefined && badge != undefined )
             result.push({'user': recievedUser, 'badge': badge});
     }
}

现在您拥有存储在user_with_most 变量中的徽章最多的用户,以及用户在most_badges 变量中存储的徽章数量。

【讨论】:

    【解决方案2】:

    您可以使用Array#forEach()thisArgs 作为临时对象作为对分组元素的引用。

    var data = [{ user: 'Abc', badge: [6] }, { user: 'PQR', badge: [7] }, { user: 'PQR', badge: [1] }, { user: 'PQR', badge: [2] }, { user: 'XYZ', badge: [-5] }],
        grouped = [],
        mostUser = [];
    
    data.forEach(function (a, i) {
        if (!this[a.user]) {
            this[a.user] = { user: a.user, badge: [] };
            grouped.push(this[a.user]);
        }
        this[a.user].badge = this[a.user].badge.concat(a.badge);
        if (!i || this[a.user].badge.length > this[mostUser[0]].badge.length) {
            mostUser = [a.user];
            return;
        }
        if (a.user !== mostUser[0] && this[a.user].badge.length === this[mostUser[0]].badge.length) {
            mostUser.push(a.user);
        }
    }, Object.create(null));
    
    document.write('<pre>' + JSON.stringify(mostUser, 0, 4) + '</pre>');
    document.write('<pre>' + JSON.stringify(grouped, 0, 4) + '</pre>');

    【讨论】:

      【解决方案3】:

      您可以在推入新项目之前修改您的函数检查返回结果,

      或者使用您已经拥有的输出,您可以使用 Array.reduce 来组织您的数组,

      这是一个使用 reduce() 的解决方案:

      var a = [ { user: 'Abc', badge: [ 6 ] },
        { user: 'PQR', badge: [ 7 ] },
        { user: 'PQR', badge: [ 1 ] },
        { user: 'PQR', badge: [ 2 ] },
        { user: 'XYZ', badge: [ -5 ] } ]
      
      
      var r= a.reduce((ac,x) => {
         (ac.some(z => {
           if(z.user === x.user)
             z.badge.push(x.badge[0]);
            return (z.user === x.user);}))
         || (ac.push(x));
          return ac;
          
        },[])
      console.log(r)
          

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-15
        • 2021-12-03
        • 2019-06-16
        • 2022-07-21
        • 1970-01-01
        相关资源
        最近更新 更多