gpt4 book ai didi

javascript - 使用 Javascript 对多个属性进行分组和求和

转载 作者:行者123 更新时间:2023-12-01 16:17:20 25 4
gpt4 key购买 nike

我试图通过多种方式解决这个问题,但无法进一步解决。

我有这样的数据:

const dummyData = [{
metric: {
id: "A",
code: "00",
advice: "123"
},
values: [[123, 1], [332, 2]]
}, {
metric: {
id: "A",
code: "01",
advice: "123"
},
values: [[123, 5], [332, 3]]
}, {
metric: {
id: "B",
code: "01",
advice: "123"
},
values: [[123, 3]]
}]

我想要 3 种不同的格式和不同的分组方式:

  • id 分组,并对 values[1] 求和例如:

    [{
    id: 'A'
    values: [{
    valueId: 123,
    value: 6 // 1 + 5
    }, {
    valueId: 332,
    value: 5 // 2 + 3
    }]
    }, {
    id: 'B'
    values: [{
    valueId: 123,
    value: 3
    }]
    }]
  • idcode 分组,然后对 values[1] 求和

    [{
    id: 'A'
    code: '00'
    values: [{
    valueId: 123,
    value: 1
    }, {
    valueId: 332,
    value: 2
    }]
    }, {
    id: 'A'
    code: '01'
    values: [{
    valueId: 123,
    value: 5
    }, {
    valueId: 332,
    value: 3
    }]
    }, {
    id: 'B'
    code: '01'
    values: [{
    valueId: 123,
    value: 3
    }]
    }]
  • idadvice 分组,然后对 values[1] 求和

    [{
    id: 'A'
    advice: '123'
    values: [{
    valueId: 123,
    value: 6 // 1 + 5
    }, {
    valueId: 332,
    value: 5 // 2 + 3
    }]
    }, {
    id: 'B'
    advice: '123'
    values: [{
    valueId: 123,
    value: 3
    }]
    }]

到目前为止,我已经成功地使用像这样的单个键进行了一些简单的分组:

const a = dummyData.reduce((accumulator, currentValue) => {
(accumulator[currentValue.metric["id"]] = accumulator[currentValue.metric["id"]] || []).push(currentValue.values)
return accumulator
}, {})

虽然它不是我期望的格式。我知道我必须使用 reduce 来实现这一点,但是我无法让它工作或者我不知道该怎么做。

最佳答案

您可以像表一样对对象进行分组,并找到用于分组的嵌套值。

此方法使用双重分组,一个用于具有所需属性的外部组,另一个用于 valueId/value

外部分组采用联合键和用于分组的值,由 | 分隔。我使用给定的键生成一个新对象,并为值生成一个空数组。

内部分组通过 valueId 进行,并搜索具有此值的对象。如果未找到,则将一个新对象添加到值数组中。

最后将值添加到特定组。

function groupBy(data, keys) {
return Object.values(data.reduce((r, { metric, values }) => {
const key = keys.map(k => metric[k]).join('|');
r[key] = r[key] || { ...Object.fromEntries(keys.map(k => [k, metric[k]])), values: [] };
values.forEach(([valueId, value]) => {
let temp = r[key].values.find(q => q.valueId === valueId);
if (!temp) r[key].values.push(temp = { valueId, value: 0 });
temp.value += value;
});
return r;
}, {}));
}

const
dummyData = [{ metric: { id: "A", code: "00", advice: "123" }, values: [[123, 1], [332, 2]] }, { metric: { id: "A", code: "01", advice: "123" }, values: [[123, 5], [332, 3]] }, { metric: { id: "B", code: "01", advice: "123" }, values: [[123, 3]] }];

console.log(groupBy(dummyData, ['id']));
console.log(groupBy(dummyData, ['id', 'code']));
console.log(groupBy(dummyData, ['id', 'advice']));
.as-console-wrapper { max-height: 100% !important; top: 0; }

关于javascript - 使用 Javascript 对多个属性进行分组和求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62550251/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com