我将在分组的直方图中显示我从数据库聚合的数据。
数据如下:
[
{
"_id": "Gas Separator Filter",
"sellingPrice": 100000,
"quantity": 10
},
{
"_id": "Dry Gas Cartridge",
"sellingPrice": 6005000,
"quantity": 15
}
]
但是为了将其显示在图表中并进行分组,我需要这样的东西。对于上面的数据集中的每个_id
,我应该能够在图表中看到两个条形。
[
{
"name": "quantity",
"Gas Separator Filter": 10,
"Dry Gas Cartridge": 15
},
{
"name": "sellingPrice",
"Gas Separator Filter": 100000,
"Dry Gas Cartridge": 6005000
}
]
已经两个小时了,我想不出一个好方法。您会提出什么建议?
答案 0 :(得分:2)
这是使用旧式循环的一种解决方案:)
const transform = (data, nameValues, keyProp) => {
const result = [];
for (const name of nameValues) {
const output = { name };
for (const value of data) {
output[value[keyProp]] = value[name];
}
result.push(output);
}
return result;
};
const result = transform(
[
{
"_id": "Gas Separator Filter",
"sellingPrice": 100000,
"quantity": 10
},
{
"_id": "Dry Gas Cartridge",
"sellingPrice": 6005000,
"quantity": 15
}
],
["sellingPrice", "quantity"],
"_id"
);
console.log(result);
答案 1 :(得分:1)
您可以使用array.reduce实现此目的:
const arrayToArray = (array) => {
var ret = [{
"name": "price"
}, {
"name": "quantity"
}
];
return array.reduce((obj, item, idx, original) => {
ret[0][item._id] = original[idx].sellingPrice;
ret[1][item._id] = original[idx].quantity;
return ret;
}, 0)
}
像这样,您用基础对象设置了一个变量,并用_id:value填充了价格和数量。 但这不是“优雅”的方式。您确定需要此对象数组结构来显示图表吗?
答案 2 :(得分:1)
我发现很难解释我的解决方案,但这是我的看法(您可以为不同的变量添加console.log
来跟随转换):
提取对象中的所有键,对其进行循环,name
将是该键,并使用嵌套循环来设置其他键和值:
const data = [ { "_id": "Gas Separator Filter", "sellingPrice": 100000, "quantity": 10 }, { "_id": "Dry Gas Cartridge", "sellingPrice": 6005000, "quantity": 15 } ]
const [_id, ...keys] = [...new Set(data.map(e => Object.keys(e)).flat())]
// console.log(keys) : ["sellingPrice", "quantity"]
const result = keys.map(key => {
const values = data.map(obj => ({
[obj._id]: obj[key]
}))
return Object.assign({
name: key
}, ...values);
})
console.log(result)