在下面的表单中,我有一个对象数组--它有三个属性serviceName、池和环境--我想根据环境对对象进行分组,同时需要连接到池中:
const data = [
{
serviceName: "visa",
pool: "3g",
environment: "test-int",
},
{
serviceName: "visa",
pool: "4g",
environment: "test-int",
},
{
serviceName: "visa",
pool: "5g",
environment: "test-int",
},
{
serviceName: "amex",
pool: "5g",
environment: "dev",
},
{
serviceName: "amex",
pool: "6g",
environment: "dev",
},
];
我希望输出的格式如下:
const output = [
{
serviceName: "visa",
pool: "3g,4g,5g",
environment: "test-int"
},
{
serviceName: "amex",
pool: "5g,6g",
environment: "dev"
},
]
根据我当前的代码,它只返回一个对象,而不是一个对象数组:
const output = data.reduce((acc, ar) => {
let res = {
...acc,
pool: acc["pool"] + "," + ar.pool
};
return res;
}
});
发布于 2022-04-24 23:21:54
我认为最基本的问题是,您需要分割出与serviceName
匹配的所有元素,然后进行简化以加入pool
值。
也许是这样的:
const res = [
{
serviceName: "visa",
pool: "3g",
environment: "test-int"
},
{
serviceName: "visa",
pool: "4g",
environment: "test-int"
},
{
serviceName: "amex",
pool: "5g",
environment: "dev"
},
{
serviceName: "amex",
pool: "6g",
environment: "dev"
}
];
const groupBy = (arr, getKey) => {
return arr.reduce((memo, item) => {
const key = getKey(item)
memo[key] ||= [];
memo[key].push(item);
return memo;
}, {})
}
const byServiceName = groupBy(res, ({serviceName}) => serviceName);
const results = Object.values(byServiceName).map((items) => {
return items.reduce((acc, item) => {
let res = {
...acc,
pool: acc["pool"] + "," + item.pool
};
return res;
})
});
console.log(results)
groupBy
函数可以简化为不接受getKey
函数,但这增加了一点灵活性。如果您知道它总是会出现在serviceName上,那么您可以使用以下内容
const groupByServiceName = (arr) => {
const key = 'serviceName'
return arr.reduce((memo, item) => {
memo[key] ||= [];
memo[key].push(item);
return memo;
}, {})
发布于 2022-04-24 23:29:07
下面是一种方法,它生成一个以environment
值为键的对象,然后将其值提取到数组中。
const data = [
{
serviceName: "visa",
pool: "3g",
environment: "test-int",
},
{
serviceName: "visa",
pool: "4g",
environment: "test-int",
},
{
serviceName: "visa",
pool: "5g",
environment: "test-int",
},
{
serviceName: "amex",
pool: "5g",
environment: "dev",
},
{
serviceName: "amex",
pool: "6g",
environment: "dev",
},
];
const output = Object.values(data.reduce((acc, ar) =>
{
if (acc[ar.environment])
acc[ar.environment].pool += "," + ar.pool;
else
acc[ar.environment] = {...ar};
return acc;
},{}));
console.log(output);
https://stackoverflow.com/questions/71992990
复制相似问题