首页 > 解决方案 > 一步减少和排序对象数组

问题描述

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

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

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];
})

标签: javascriptarrayssorting

解决方案


您可以先对数据进行排序,然后再进行转换,而不是将数据分成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);


推荐阅读