如何使用顺序数组对对象数组进行重新排序?

时间:2019-03-18 21:16:12

标签: javascript arrays ecmascript-6

我需要重新排列数组中的某些对象。

假设这是我的数据数组:

const data = [
  { id: 'ETHUVMY0m', name: 'item 1', value: 'value 1' },
  { id: 'McfTB40vO', name: 'item 2', value: 'value 2' }
]

还有另一个数组,代表新的顺序:

const order = [ 'McfTB40vO', 'ETHUVMY0m' ]

如您所见,第二项放在第一位。

所以结果应该是:

[
  { id: 'McfTB40vO', name: 'item 2', value: 'value 2' },
  { id: 'ETHUVMY0m', name: 'item 1', value: 'value 1' }
]

我想到了使用forEach循环:

data.forEach(d => {
  order.indexOf(d.id) // get new index
  // but how to reorder the array?
})

3 个答案:

答案 0 :(得分:3)

通过dataid转换为Map对象。然后在order数组上使用Array.map(),然后从Map中获取相关项目:

const data = [
  { id: 'ETHUVMY0m', name: 'item 1', value: 'value 1' },
  { id: 'McfTB40vO', name: 'item 2', value: 'value 2' }
]

const order = [ 'McfTB40vO', 'ETHUVMY0m' ]

const dataMap = new Map(data.map(o => [o.id, o]))
const result = order.map(id => dataMap.get(id))

console.log(result)

答案 1 :(得分:2)

如果您想一劳永逸,请使用map和find而不是forEach:

const data = [
  { id: 'ETHUVMY0m', name: 'item 1', value: 'value 1' },
  { id: 'McfTB40vO', name: 'item 2', value: 'value 2' }
];

const order = [ 'McfTB40vO', 'ETHUVMY0m' ];

const result = order.map(id => data.find(x => x.id === id));

console.log(result);

答案 2 :(得分:0)

您可以在maporder

const data = [{
    id: 'ETHUVMY0m',
    name: 'item 1',
    value: 'value 1'
  },
  {
    id: 'McfTB40vO',
    name: 'item 2',
    value: 'value 2'
  }
]

const order = ['McfTB40vO', 'ETHUVMY0m']

const output = order.map(d => data.find(({
  id
}) => d == id));

console.log(output);