一步减少和排序对象数组



我试图从源数据数组中获取两个值(标签和数据(,重命名标签值,并对结果对象中的标签和数据数组进行排序。

如果这是我的源数据。。。

const sourceData = [
{ _id: 'any', count: 12 },
{ _id: 'thing', count: 34 },
{ _id: 'value', count: 56 }
];

结果应该是:

{ label: ['car', 'plane', 'ship'], data: [12, 34, 56] }

所以任何都应该变成汽车东西应该变成飞机并且应变成飞船

但我也想使用标签值更改结果数组中元素的顺序,这也应该对数据值进行排序。

让我们假设这个结果是预期的:

{ label: ['ship', 'car', 'plane'], data: [56, 12, 34] }

对于以下解决方案,需要两个变量(mapsorder(。我认为最好只使用一种贴图,它应该设置新的标签值和顺序。也许用数组?!现在只有标签值得到排序,但数据值应该以相同的方式排序。。。

const maps = { any: 'car', thing: 'plane', value: 'ship' }; // 1. Rename label values
const result = sourceData.reduce((a, c) => {
a.label = a.label || [];
a.data = a.data || [];
a.label.push(maps[c._id]);
a.data.push(c.count);
return a;
}, {});
result.label.sort((a, b) => {
const order = {'ship': 1, 'car': 2, plane: 3}; // 2. Set new order
return order[a] - order[b];
})

您可以将信息移动到单个对象中。

const
data = [{ _id: 'any', count: 12 }, { _id: 'thing', count: 34 }, { _id: 'value', count: 56 }],
target = { any: { label: 'car', index: 1 }, thing: { label: 'plane', index: 2 }, value: { label: 'ship', index: 0 } },
result = data.reduce((r, { _id, count }) => {
r.label[target[_id].index] = target[_id].label;
r.data[target[_id].index] = count;
return r;
}, { label: [], data: [] })
console.log(result);

您可以先对数据进行排序,然后进行转换,而不是将数据分离为labeldata,然后将它们一起排序。

const sourceData = [
{ _id: 'any', count: 12 },
{ _id: 'thing', count: 34 },
{ _id: 'value', count: 56 }
];
const maps = { any: 'car', thing: 'plane', value: 'ship' };
// Rename label values.
let result = sourceData.map(item => ({
...item,
_id: maps[item._id]
}));
// Sort the data.
result.sort((a, b) => {
const order = {'ship': 1, 'car': 2, plane: 3};
return order[a._id] - order[b._id];
})
// Transform the result.
result = result.reduce((a, c) => {
a.label = a.label || [];
a.data = a.data || [];
a.label.push(c._id);
a.data.push(c.count);
return a;
}, {});
console.log(result);

最新更新