javascript - 更新嵌套对象数组

标签 javascript arrays object

使用对象数组时,我需要使用 type 更新任何对象的计数的 Select (Multiple Answer) .

每个对象都有一个 typeSelect (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
            ),

以及一个用于将新对象映射到counttotalvalue 的函数。

            ([value, count]) => ({ count, total, value })

reduce 的回调中,countvalue 被解构,并且 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/

相关文章:

c# - 使用 JavaScript 和 Razor 检测移动设备

arrays - 如何在 MATLAB 中声明一个没有大小的数组?

c++ - Template Specialization pointer to pointer and array passing template deduction

java - 如何限制Java对象的创建?

Javascript - 比较对象并在新对象中存储差异

javascript - 将具有随机分辨率的图像居中到固定大小的父 div 的中心

javascript - heroku无法向mlab写入数据

javascript - 如何在 jQuery 对象上创建 catch all 函数?

c - 在 C 中的数组网格上移动对象

javascript - 将数组中的所有对象合并为一个