使用对象数组时,我需要使用 type
更新任何对象的计数的 Select (Multiple Answer)
.
每个对象都有一个 type
的 Select (Multiple Answer)
包含 data
用逗号分隔的对象数组 value
比如“价格过高,独特,高质量”。这些值应该分离到它们自己的对象中,并包含在新的 count
中。和 total
(所有 count
值的总和)对于特定的 data
对象数组。
const arr = [
{
data: [
{count: 7, total: 7, value: "N/A"},
],
name: "item 1",
type: "Yes/No",
}, {
data: [
{count: 5, total: 7, value: "N/A"},
{count: 2, total: 7, value: "Yellow"},
],
name: "item 2",
type: "Select (Single Answer)",
}, {
data: [
{count: 5, total: 7, value: "N/A"},
{count: 1, total: 7, value: "Overpriced,Unique,High quality"},
{count: 1, total: 7, value: "Reliable,High quality"},
],
name: "item 3",
type: "Select (Multiple Answer)",
},
];
预期结果
const result = [
{
data: [
{count: 7, total: 7, value: "N/A"},
],
name: "item 1",
type: "Yes/No",
}, {
data: [
{count: 5, total: 7, value: "N/A"},
{count: 2, total: 7, value: "Yellow"},
],
name: "item 2",
type: "Select (Single Answer)",
}, {
data: [
{count: 5, total: 10, value: "N/A"},
{count: 2, total: 10, value: "High quality"},
{count: 1, total: 10, value: "Overpriced"},
{count: 1, total: 10, value: "Unique"},
{count: 1, total: 10, value: "Reliable"},
],
name: "item 3",
type: "Select (Multiple Answer)",
},
];
我已经开始使用 reduce
函数,但它产生的对象与预期结果相去甚远:
当前代码
arr.reduce((a, c) => {
a[c.data.value] = a[c.data.value] || { total: 0 };
a[c.data.value].total += 1;
return a;
}, {})
不希望的结果
{ undefined: { total: 4 } }
最佳答案
您可以收集组并通过闭包获得total
。
它在 total
上有一个闭包并返回一个数组
data: (total => Array.from(
))(0)
通过拍摄Map
用于收集数据作为 initialValue
o.data.reduce(
new Map
),
以及一个用于将新对象映射到count
、total
和value
的函数。
([value, count]) => ({ count, total, value })
在 reduce
的回调中,count
和 value
被解构,并且 value 被拆分以获取所有计数到收集的所有拆分值一张 map 。同时,total
随实际计数增加。最后,返回 map m
。
(m, { count, value }) => (value.split(',').forEach(
v => (m.set(v, (m.get(v) || 0) + count), total+= count)
), m),
var data = [{ data: [{ count: 7, total: 7, value: "N/A" }], name: "item 1", type: "Yes/No" }, { data: [{ count: 5, total: 7, value: "N/A" }, { count: 2, total: 7, value: "Yellow" }], name: "item 2", type: "Select (Single Answer)" }, { data: [{ count: 5, total: 7, value: "N/A" }, { count: 1, total: 7, value: "Overpriced,Unique,High quality" }, { count: 1, total: 7, value: "Reliable,High quality" }], name: "item 3", type: "Select (Multiple Answer)" }],
result = data.map(o => Object.assign({}, o, {
data: (total => Array.from(
o.data.reduce(
(m, { count, value }) => (value.split(',').forEach(
v => (m.set(v, (m.get(v) || 0) + count), total+= count)
), m),
new Map
),
([value, count]) => ({ count, total, value })
))(0)
}));
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
关于javascript - 更新嵌套对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54298220/