Javascript 合并对象数组,不重复
Javascript merge array of objects, no duplicates
我有以下数据:
// Data
const groups = [
[
{ group: 'All', entries: 121, score: 10.89, grade: 16, avg: 15.8 },
{ group: 'All', entries: 221, score: 20.89, grade: 26, avg: 25.8 },
{ group: 'All', entries: 321, score: 30.89, grade: 36, avg: 35.8 },
{ group: 'All', entries: 421, score: 40.89, grade: 46, avg: 45.8 }
],
[
{ group: 'Inner', entries: 121, score: 10.89, grade: 16, avg: 15.8 },
{ group: 'Inner', entries: 221, score: 20.89, grade: 26, avg: 25.8 },
{ group: 'Inner', entries: 321, score: 30.89, grade: 36, avg: 35.8 },
{ group: 'Inner', entries: 421, score: 40.89, grade: 46, avg: 45.8 }
],
[
{ group: 'Outer', entries: 121, score: 10.89, grade: 16, avg: 15.8 },
{ group: 'Outer', entries: 221, score: 20.89, grade: 26, avg: 25.8 },
{ group: 'Outer', entries: 321, score: 30.89, grade: 36, avg: 35.8 },
{ group: 'Outer', entries: 421, score: 40.89, grade: 46, avg: 45.8 }
]
];
我想要的结果是:
// Desired
[
[
{
group: 'All',
entries0: 121,
score0: 10.89,
grade0: 16,
avg0: 15.8,
entries1: 121,
score2: 10.89,
grade2: 16,
avg2: 15.8,
entries3: 121,
score3: 10.89,
grade3: 16,
avg3: 15.8,
entries4: 121,
score4: 10.89,
grade4: 16,
avg4: 15.8
}
]
... all other groups formatted the same
];
谁能给我指出正确的方向?我尝试了多种选择,但到目前为止我的代码如下:
groups.map((group) => {
return Object.values(group).reduce((acc, curr) => {
!acc.includes(curr.group) &&
acc.push({
group: curr.group,
...curr.score
});
return acc;
});
});
这是一个选项 - 对于每个组数组,创建 group
的条目,然后 flatMap
内部对象的条目,仅采用非组键,并映射每个条目以添加每个的索引:
const groups = [
[
{ group: 'All', entries: 121, score: 10.89, grade: 16, avg: 15.8 },
{ group: 'All', entries: 221, score: 20.89, grade: 26, avg: 25.8 },
{ group: 'All', entries: 321, score: 30.89, grade: 36, avg: 35.8 },
{ group: 'All', entries: 421, score: 40.89, grade: 46, avg: 45.8 }
],
[
{ group: 'Inner', entries: 121, score: 10.89, grade: 16, avg: 15.8 },
{ group: 'Inner', entries: 221, score: 20.89, grade: 26, avg: 25.8 },
{ group: 'Inner', entries: 321, score: 30.89, grade: 36, avg: 35.8 },
{ group: 'Inner', entries: 421, score: 40.89, grade: 46, avg: 45.8 }
],
[
{ group: 'Outer', entries: 121, score: 10.89, grade: 16, avg: 15.8 },
{ group: 'Outer', entries: 221, score: 20.89, grade: 26, avg: 25.8 },
{ group: 'Outer', entries: 321, score: 30.89, grade: 36, avg: 35.8 },
{ group: 'Outer', entries: 421, score: 40.89, grade: 46, avg: 45.8 }
]
];
const output = groups.map(
groupArr => [Object.fromEntries([
['group', groupArr[0].group],
...groupArr.flatMap(
(obj, i) => Object.entries(obj)
.filter(([key]) => key !== 'group')
.map(([key, val]) => [key + i, val])
)
])]
);
console.log(output);
您可以采用两个嵌套循环。
const
groups = [[{ group: 'All', entries: 121, score: 10.89, grade: 16, avg: 15.8 }, { group: 'All', entries: 221, score: 20.89, grade: 26, avg: 25.8 }, { group: 'All', entries: 321, score: 30.89, grade: 36, avg: 35.8 }, { group: 'All', entries: 421, score: 40.89, grade: 46, avg: 45.8 }], [{ group: 'Inner', entries: 121, score: 10.89, grade: 16, avg: 15.8 }, { group: 'Inner', entries: 221, score: 20.89, grade: 26, avg: 25.8 }, { group: 'Inner', entries: 321, score: 30.89, grade: 36, avg: 35.8 }, { group: 'Inner', entries: 421, score: 40.89, grade: 46, avg: 45.8 }], [{ group: 'Outer', entries: 121, score: 10.89, grade: 16, avg: 15.8 }, { group: 'Outer', entries: 221, score: 20.89, grade: 26, avg: 25.8 }, { group: 'Outer', entries: 321, score: 30.89, grade: 36, avg: 35.8 }, { group: 'Outer', entries: 421, score: 40.89, grade: 46, avg: 45.8 }]],
result = groups.map(a => a.reduce((r, { group, ...o }, i) => {
r.group = group;
Object.entries(o).forEach(([k, v]) => r[k + i] = v);
return r;
}, {}));
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
使用 reduce
和 Object.entries
。这只是对你方向的轻微改变。
const groups = [
[
{ group: "All", entries: 121, score: 10.89, grade: 16, avg: 15.8 },
{ group: "All", entries: 221, score: 20.89, grade: 26, avg: 25.8 },
{ group: "All", entries: 321, score: 30.89, grade: 36, avg: 35.8 },
{ group: "All", entries: 421, score: 40.89, grade: 46, avg: 45.8 }
],
[
{ group: "Inner", entries: 121, score: 10.89, grade: 16, avg: 15.8 },
{ group: "Inner", entries: 221, score: 20.89, grade: 26, avg: 25.8 },
{ group: "Inner", entries: 321, score: 30.89, grade: 36, avg: 35.8 },
{ group: "Inner", entries: 421, score: 40.89, grade: 46, avg: 45.8 }
],
[
{ group: "Outer", entries: 121, score: 10.89, grade: 16, avg: 15.8 },
{ group: "Outer", entries: 221, score: 20.89, grade: 26, avg: 25.8 },
{ group: "Outer", entries: 321, score: 30.89, grade: 36, avg: 35.8 },
{ group: "Outer", entries: 421, score: 40.89, grade: 46, avg: 45.8 }
]
];
const updated = groups.map(group => [
group.reduce(
(acc, curr, i) =>
Object.assign(
acc,
Object.fromEntries(
Object.entries(curr).map(([key, value]) => [
`${key}${key === "group" ? "" : i}`,
value
])
)
),
{}
)
]);
console.log(updated);
我有以下数据:
// Data
const groups = [
[
{ group: 'All', entries: 121, score: 10.89, grade: 16, avg: 15.8 },
{ group: 'All', entries: 221, score: 20.89, grade: 26, avg: 25.8 },
{ group: 'All', entries: 321, score: 30.89, grade: 36, avg: 35.8 },
{ group: 'All', entries: 421, score: 40.89, grade: 46, avg: 45.8 }
],
[
{ group: 'Inner', entries: 121, score: 10.89, grade: 16, avg: 15.8 },
{ group: 'Inner', entries: 221, score: 20.89, grade: 26, avg: 25.8 },
{ group: 'Inner', entries: 321, score: 30.89, grade: 36, avg: 35.8 },
{ group: 'Inner', entries: 421, score: 40.89, grade: 46, avg: 45.8 }
],
[
{ group: 'Outer', entries: 121, score: 10.89, grade: 16, avg: 15.8 },
{ group: 'Outer', entries: 221, score: 20.89, grade: 26, avg: 25.8 },
{ group: 'Outer', entries: 321, score: 30.89, grade: 36, avg: 35.8 },
{ group: 'Outer', entries: 421, score: 40.89, grade: 46, avg: 45.8 }
]
];
我想要的结果是:
// Desired
[
[
{
group: 'All',
entries0: 121,
score0: 10.89,
grade0: 16,
avg0: 15.8,
entries1: 121,
score2: 10.89,
grade2: 16,
avg2: 15.8,
entries3: 121,
score3: 10.89,
grade3: 16,
avg3: 15.8,
entries4: 121,
score4: 10.89,
grade4: 16,
avg4: 15.8
}
]
... all other groups formatted the same
];
谁能给我指出正确的方向?我尝试了多种选择,但到目前为止我的代码如下:
groups.map((group) => {
return Object.values(group).reduce((acc, curr) => {
!acc.includes(curr.group) &&
acc.push({
group: curr.group,
...curr.score
});
return acc;
});
});
这是一个选项 - 对于每个组数组,创建 group
的条目,然后 flatMap
内部对象的条目,仅采用非组键,并映射每个条目以添加每个的索引:
const groups = [
[
{ group: 'All', entries: 121, score: 10.89, grade: 16, avg: 15.8 },
{ group: 'All', entries: 221, score: 20.89, grade: 26, avg: 25.8 },
{ group: 'All', entries: 321, score: 30.89, grade: 36, avg: 35.8 },
{ group: 'All', entries: 421, score: 40.89, grade: 46, avg: 45.8 }
],
[
{ group: 'Inner', entries: 121, score: 10.89, grade: 16, avg: 15.8 },
{ group: 'Inner', entries: 221, score: 20.89, grade: 26, avg: 25.8 },
{ group: 'Inner', entries: 321, score: 30.89, grade: 36, avg: 35.8 },
{ group: 'Inner', entries: 421, score: 40.89, grade: 46, avg: 45.8 }
],
[
{ group: 'Outer', entries: 121, score: 10.89, grade: 16, avg: 15.8 },
{ group: 'Outer', entries: 221, score: 20.89, grade: 26, avg: 25.8 },
{ group: 'Outer', entries: 321, score: 30.89, grade: 36, avg: 35.8 },
{ group: 'Outer', entries: 421, score: 40.89, grade: 46, avg: 45.8 }
]
];
const output = groups.map(
groupArr => [Object.fromEntries([
['group', groupArr[0].group],
...groupArr.flatMap(
(obj, i) => Object.entries(obj)
.filter(([key]) => key !== 'group')
.map(([key, val]) => [key + i, val])
)
])]
);
console.log(output);
您可以采用两个嵌套循环。
const
groups = [[{ group: 'All', entries: 121, score: 10.89, grade: 16, avg: 15.8 }, { group: 'All', entries: 221, score: 20.89, grade: 26, avg: 25.8 }, { group: 'All', entries: 321, score: 30.89, grade: 36, avg: 35.8 }, { group: 'All', entries: 421, score: 40.89, grade: 46, avg: 45.8 }], [{ group: 'Inner', entries: 121, score: 10.89, grade: 16, avg: 15.8 }, { group: 'Inner', entries: 221, score: 20.89, grade: 26, avg: 25.8 }, { group: 'Inner', entries: 321, score: 30.89, grade: 36, avg: 35.8 }, { group: 'Inner', entries: 421, score: 40.89, grade: 46, avg: 45.8 }], [{ group: 'Outer', entries: 121, score: 10.89, grade: 16, avg: 15.8 }, { group: 'Outer', entries: 221, score: 20.89, grade: 26, avg: 25.8 }, { group: 'Outer', entries: 321, score: 30.89, grade: 36, avg: 35.8 }, { group: 'Outer', entries: 421, score: 40.89, grade: 46, avg: 45.8 }]],
result = groups.map(a => a.reduce((r, { group, ...o }, i) => {
r.group = group;
Object.entries(o).forEach(([k, v]) => r[k + i] = v);
return r;
}, {}));
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
使用 reduce
和 Object.entries
。这只是对你方向的轻微改变。
const groups = [
[
{ group: "All", entries: 121, score: 10.89, grade: 16, avg: 15.8 },
{ group: "All", entries: 221, score: 20.89, grade: 26, avg: 25.8 },
{ group: "All", entries: 321, score: 30.89, grade: 36, avg: 35.8 },
{ group: "All", entries: 421, score: 40.89, grade: 46, avg: 45.8 }
],
[
{ group: "Inner", entries: 121, score: 10.89, grade: 16, avg: 15.8 },
{ group: "Inner", entries: 221, score: 20.89, grade: 26, avg: 25.8 },
{ group: "Inner", entries: 321, score: 30.89, grade: 36, avg: 35.8 },
{ group: "Inner", entries: 421, score: 40.89, grade: 46, avg: 45.8 }
],
[
{ group: "Outer", entries: 121, score: 10.89, grade: 16, avg: 15.8 },
{ group: "Outer", entries: 221, score: 20.89, grade: 26, avg: 25.8 },
{ group: "Outer", entries: 321, score: 30.89, grade: 36, avg: 35.8 },
{ group: "Outer", entries: 421, score: 40.89, grade: 46, avg: 45.8 }
]
];
const updated = groups.map(group => [
group.reduce(
(acc, curr, i) =>
Object.assign(
acc,
Object.fromEntries(
Object.entries(curr).map(([key, value]) => [
`${key}${key === "group" ? "" : i}`,
value
])
)
),
{}
)
]);
console.log(updated);