【问题标题】:Lodash filter to group objectsLodash 过滤器对对象进行分组
【发布时间】:2023-01-25 01:13:26
【问题描述】:

我有一个数组,我喜欢按 ID 分组,但将数组中的所有不同元素推送到结果中。

let data = [
    {   id: "1", elements: ["a","b"], files: []    },
    {   id: "1", elements: ["a","b"], files: []    },
    {   id: "2", elements: ["a","b","c"],
        files: [
            { name: "test1",
              extension: "pdf"
            },
            { name: "test2",
              extension: "pdf"
            }
        ]
    },
    {   id: "2", elements: ["a","b","c"],
        files: [
            { name: "test3",
              extension: "png"
            },
            { name: "test4",
              extension: "png"
            },
            { name: "test5",
              extension: "pdf"
            }
        ]
    },
    {   id: "2", elements: ["a","b","c"], files: []
    }
];

我想要一个结果

result = 
[
    {
        "id": "1", "elements": [ "a", "b" ], "files": []    },
    {
        "id": "2", "elements": [ "a", "b", "c" ],
        "files": [
            { "name": "test1", "extension": "pdf" },
            { "name": "test2", "extension": "pdf" },
            { "name": "test3", "extension": "png" },
            { "name": "test4", "extension": "png" },
            { "name": "test5", "extension": "pdf" },
        ]
    }
]

lodash 或任何其他进程如何获得所需的输出

【问题讨论】:

    标签: javascript lodash


    【解决方案1】:

    您可以使用Array.reduce() 将项目按id 分组。

    这会为每个 id 创建一个具有属性的对象,然后我们可以使用 Object.values() 将结果作为数组获取。

    对于 elements 数组,我们还将使用 Set 来确保我们不会重复元素。例如,我们只想要 ['a','b'] 而不是 ['a','b','a','b']。

    let data = [ {   id: "1", elements: ["a","b"], files: []    }, {   id: "1", elements: ["a","b"], files: []    }, {   id: "2", elements: ["a","b","c"], files: [ { name: "test1", extension: "pdf" }, { name: "test2", extension: "pdf" } ] }, {   id: "2", elements: ["a","b","c"], files: [ { name: "test3", extension: "png" }, { name: "test4", extension: "png" }, { name: "test5", extension: "pdf" } ] }, {   id: "2", elements: ["a","b","c"], files: [] } ];
    
    const result = Object.values(data.reduce((acc, { id, elements, files }) => { 
        acc[id] = acc[id] || { id, elements: [], files: []};
        // Use a Set to avoid duplicates...
        acc[id].elements = [...new Set([...elements, ...acc[id].elements])];
        acc[id].files.push(...files);
        return acc;
    }, {}));
    
    console.log('Result:', result)
    .as-console-wrapper { max-height: 100% !important; }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-04
      • 2021-06-26
      • 1970-01-01
      • 2016-12-27
      • 2016-03-23
      • 2018-08-22
      • 2018-01-09
      • 1970-01-01
      相关资源
      最近更新 更多