如果以下面的数组为例,我希望函数比较每个对象的键,如果相同,则将它们合并到新对象。
对于内部对象(团队的值),如果键匹配且某个人的值为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}
答案 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>