javascript - 一步减少和排序对象数组
问题描述
我试图从我的源数据数组中获取两个值(标签和数据),重命名标签值并对结果对象中的标签和数据数组进行排序。
如果这是我的源数据...
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] }
对于以下解决方案,需要两个变量(maps
和order
)。我认为最好只使用一种地图,它应该设置新的标签值和顺序。也许有一个数组?!现在只有标签值被排序,但数据值应该以相同的方式排序......
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];
})
解决方案
您可以先对数据进行排序,然后再进行转换,而不是将数据分成label
然后data
将它们排序在一起。
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);
推荐阅读
- java - 调用多线程 C++ 代码时 JNI 是否正常工作?
- sql - 如何在 django 中使用 NOT IN sql 查询
- google-maps - 启用地理编码 API 时,Google Maps JavaScript API 抛出“ExpiredKeyMapError”
- javascript - 如何修复这个简单的均值计算器以使其正常工作,以及如何制作它以便它需要尽可能多的数字?
- python - xlsxwriter pandas frame:如果列中有空白单元格,则突出显示行
- electron - Electron:如何删除不需要的模块?
- javascript - 谁将 mp4 文件转换为 Wav 音频文件?
- c# - 如何将 ping 的用户名和变量传递给机器人命令
- generics - 特质不能变成对象
- node.js - 如何将模型结果传递给节点 js 中的视图