简体   繁体   English

Javascript合并对象数组,没有重复

[英]Javascript merge array of objects, no duplicates

I have the following data:我有以下数据:

// 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 }
    ]
];

My desired outcome is:我想要的结果是:

// 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
];

Please can anyone point me in the right direction?请有人能指出我正确的方向吗? I have tried numerous options but my code so far is as follows:我尝试了很多选项,但到目前为止我的代码如下:

groups.map((group) => {
    return Object.values(group).reduce((acc, curr) => {
        !acc.includes(curr.group) &&
            acc.push({
                group: curr.group,
                ...curr.score
            });

        return acc;
    });
});

Here's one option - for each group array, make an entry of the group , then flatMap the inner objects' entries, taking only non-group keys, and mapping each entry to add the index to each:这里有一个选项-对于每个组阵列中,使一个条目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);

You could take two nested loops.您可以采用两个嵌套循环。

 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; }

Using reduce and Object.entries .使用reduceObject.entries This is just slight changes to your direction.这只是您方向的微小变化。

 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);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM