给定对象数组,如何根据键在数组内合并对象?

时间:2018-08-25 00:00:24

标签: javascript

如果以下面的数组为例,我希望函数比较每个对象的键,如果相同,则将它们合并到新对象。

对于内部对象(团队的值),如果键匹配且某个人的值为OWNER,则保留该值,而忽略Member,否则保留Member。

var array= [{team1 : {tim : OWNER, joe : MEMBER,jane : MEMBER}}, 
        {team1 : {bob : MEMBER, joe : OWNER}},
        {team2 : {bob : OWNER, tim : OWNER}}]

Return newTeam1= {tim : Owner, Joe:Owner , Jane : Member} 

2 个答案:

答案 0 :(得分:0)

这是一种有条件地将团队简化为带有每个团队标签的对象的方法。名称冲突的成员将在最终输出中解析为键"OWNER"

此外,在您的"team1"结果中,我包括了"team1"第二个实例中的Bob,但是您可以通过删除!(member in a[team]) ||来删除他。除非第一名成员与第一名成员名称冲突且为"OWNER",否则它将忽略第一名成员之后的新成员。

var array = [{team1:{tim:"OWNER", joe:"MEMBER",jane:"MEMBER"}}, 
             {team1:{bob:"MEMBER", joe:"OWNER"}},
             {team2:{bob:"OWNER", tim:"OWNER"}}];

console.log(array.reduce((a, o) => {
  for (const team in o) {
    if (team in a) {
      for (const member in o[team]) {
        if (!(member in a[team]) || a[team][member] === "MEMBER") {
          a[team][member] = o[team][member];
        }
      }
    }
    else {
      a[team] = o[team];
    }
  }
  
  return a;
}, {}));

答案 1 :(得分:0)

有很多流行的库都支持深度合并:

var array = [{team1 : {tim : 'OWNER' , joe : 'MEMBER', jane: 'MEMBER'}}, 
             {team1 : {bob : 'MEMBER', joe : 'OWNER'}},
             {team2 : {bob : 'OWNER' , tim : 'OWNER'}}]

console.log( _.merge({}, ...array) )
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.10/lodash.min.js"></script>