gpt4 book ai didi

javascript - 如何基于动态键创建嵌套对象

转载 作者:行者123 更新时间:2023-11-29 15:09:43 25 4
gpt4 key购买 nike

我需要将一些数据转换成特殊格式。棘手的部分是,它需要通过动态键进行分组和嵌套。由于原始数据是平坦的。

这是一些简化的示例数据:

const data = [
{
category: 'Classic',
price: 1,
order: '1233-ABC'
currency: 'EUR',
},
{
category: 'Classic',
price: 2,
order: '1234-ABC'
currency: 'EUR',
},
{
category: 'Modern',
price: 3,
order: '1235-ABC'
currency: 'USD',
},
{
category: 'Classic',
price: 4,
order: '1236-ABC'
currency: 'EUR',
},
{
category: 'Modern',
price: 5,
order: '1237-ABC'
currency: 'EUR',
},
{
category: 'Classic',
price: 6,
order: '1238-ABC'
currency: 'USD',
},
{
category: 'Modern',
price: 7,
order: '1239-ABC'
currency: 'USD',
}
];

现在我想定义分组和聚合。

例如:

grouping = ['category'];
sum = ['price'];

因此它应该按 category 键分组并汇总所有 price 键条目。

//预期输出

[{
category: 'Classic',
price: 13
}, {
category: 'Modern',
price: 15
}]

我在 reduce 中得到了这个。

代码如下:

let groupingsField = ['category'];
let aggregateField = ['price']

let [group, ...rest] = groupingsField
let [sum, ...noone] = aggregateField

const groupedData = data.reduce((acc, current) => {
acc.push({
[group]: current[group],
[sum]: data.filter(item => item[group] === current[group])
.map(el => el[sum])
.reduce((total, current) => total + current)
})

return acc
}, [])
.reduce((acc, current) => {
const x = acc.find(item => item[group] === current[group])

return !x ? acc.concat([current]) : acc
}, [])

但是,我需要分组是动态的,如果那里存在超过 1 个值,它应该创建嵌套的 sub 数据集。应该可以添加多个分组。

//示例 2

grouping = ['category', 'currency'];
sum = ['price'];

//预期输出

[{
category: 'Classic',
price: 13,
sub: [{
currency: 'EUR',
price: 7
}, {
currency: 'USD',
price: 6
}]
}, {
category: 'Modern',
price: 15,
sub: [{
currency: 'EUR',
price: 9
}, {
currency: 'USD',
price: 10
}]
}]

因此,如果我要在分组中添加另一个键

grouping = ['category', 'currency', 'something'];

应该是三层深嵌套。

{
category: 'Modern',
price: 15,
sub: [{
currency: 'EUR',
price: 9,
sub: [{
someting: ...
price: ...
}]
}]
}

但是,我无法理解如何根据分组动态添加嵌套。我想我需要在这里进行一些递归。

希望得到一些帮助!

最佳答案

感谢您的帮助!然而,经过一段时间的 sleep 后,我想出了自己的解决方案:


groups = ['category', 'currency']; // this can be dynamic
sum = ['price'];

function createGroup (groups, data, sum, childNode = 'sub') {
let [primaryGroup, ...rest] = groups;

let groupedData = data.reduce((acc, current) => {
let chunk = {
[primaryGroup]: current[primaryGroup],
[sum]: data.filter(item => item[primaryGroup] === current[primaryGroup])
.map(el => el[sum])
.reduce((total, current) => total + current),
...(rest.length > 0 ? {[childNode]: createGroup(rest, data)} : {})
}

acc.push(chunk)
return acc
}, [])
.reduce((acc, current) => {
const x = acc.find(item => item[primaryGroup] === current[primaryGroup])
return !x ? acc.concat([current]) : acc
}, [])

return groupedData;
}

关于javascript - 如何基于动态键创建嵌套对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56063836/

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