用 JS 操作对象
Manipulate Object with JS
我有这个对象:
const data = {
Jan: [{product: 'Shirt', num: '13'}, {product: 'Shoes', num: '15'}],
Feb: [{product: 'Shirt', num: '22'}, {product: 'Shoes', num: '1'}],
Mar: [{product: 'Shirt', num: '15'}, {product: 'Shoes', num: '25'}]
}
我需要创建另一个如下所示的对象:
const data = {
labels: ['Jan', 'Feb', 'Mar'],
datasets: [
{
label: 'Shirt',
data: [13, 22, 15]
},
{
label: 'Shoes',
data: [15, 1, 25]
}
]
}
上面的对象是一个chartJs。 datasets数组中的data数组,对应产品每个月的每个值。
提前致谢
您可以使用 Array.prototype.reduce
创建数据集并创建新数据数组。
请注意,您必须将数组展平,因为 Object.values(data)
为您提供了一个数组数组。
const data = {
Jan: [{product: 'Shirt', num: '13'}, {product: 'Shoes', num: '15'}],
Feb: [{product: 'Shirt', num: '22'}, {product: 'Shoes', num: '1'}],
Mar: [{product: 'Shirt', num: '15'}, {product: 'Shoes', num: '25'}]
};
// Iterate through the data object's value and flatten this
// For example the Object.values(data) will provide you-
// [[{product: 'shirt', num: '13'}, {product: 'Shoes', num: '15'}], [{product: 'Shirt', num: '22'}, {product: 'Shoes', num: '1'}]] so on and so forth
// Need to make this a linear array using flat(1)
const dataset = Object.values(data).flat(1).reduce((acc, curr) => {
// Check if the product exists on the accumulator or not. If not then create a new
// object for the product.
// For example, this will create - {'Shirt': {label: 'Shirt', data: [13]}}
if (acc[curr.product] === undefined) {
acc[curr.product] = {
label: curr.product,
data: [Number(curr.num)]
}
} else {
// If the product already exists then push the num to the data array
acc[curr.product].data.push(Number(curr.num))
}
return acc;
}, {});
const newData = {
labels: Object.keys(data), // Set the keys as the labels
dataset: Object.values(dataset) // dataset is an object, just extract the values as an array
}
console.log(newData);
.as-console-wrapper{ min-height: 100vh!important; top: 0;}
我有这个对象:
const data = {
Jan: [{product: 'Shirt', num: '13'}, {product: 'Shoes', num: '15'}],
Feb: [{product: 'Shirt', num: '22'}, {product: 'Shoes', num: '1'}],
Mar: [{product: 'Shirt', num: '15'}, {product: 'Shoes', num: '25'}]
}
我需要创建另一个如下所示的对象:
const data = {
labels: ['Jan', 'Feb', 'Mar'],
datasets: [
{
label: 'Shirt',
data: [13, 22, 15]
},
{
label: 'Shoes',
data: [15, 1, 25]
}
]
}
上面的对象是一个chartJs。 datasets数组中的data数组,对应产品每个月的每个值。
提前致谢
您可以使用 Array.prototype.reduce
创建数据集并创建新数据数组。
请注意,您必须将数组展平,因为 Object.values(data)
为您提供了一个数组数组。
const data = {
Jan: [{product: 'Shirt', num: '13'}, {product: 'Shoes', num: '15'}],
Feb: [{product: 'Shirt', num: '22'}, {product: 'Shoes', num: '1'}],
Mar: [{product: 'Shirt', num: '15'}, {product: 'Shoes', num: '25'}]
};
// Iterate through the data object's value and flatten this
// For example the Object.values(data) will provide you-
// [[{product: 'shirt', num: '13'}, {product: 'Shoes', num: '15'}], [{product: 'Shirt', num: '22'}, {product: 'Shoes', num: '1'}]] so on and so forth
// Need to make this a linear array using flat(1)
const dataset = Object.values(data).flat(1).reduce((acc, curr) => {
// Check if the product exists on the accumulator or not. If not then create a new
// object for the product.
// For example, this will create - {'Shirt': {label: 'Shirt', data: [13]}}
if (acc[curr.product] === undefined) {
acc[curr.product] = {
label: curr.product,
data: [Number(curr.num)]
}
} else {
// If the product already exists then push the num to the data array
acc[curr.product].data.push(Number(curr.num))
}
return acc;
}, {});
const newData = {
labels: Object.keys(data), // Set the keys as the labels
dataset: Object.values(dataset) // dataset is an object, just extract the values as an array
}
console.log(newData);
.as-console-wrapper{ min-height: 100vh!important; top: 0;}