根据ID数组排序对象数组

时间:2017-11-16 03:06:13

标签: ecmascript-6

如果我有一个

数组
const users = [
  { id: 2, name: 'User 2' },
  { id: 5, name: 'User 5' },
  { id: 3, name: 'User 3' },
]

如何根据此数组

订购它们
const ids = [5, 2, 3]

这样结果就像

const users = [
  { id: 5, name: 'User 5' },
  { id: 2, name: 'User 2' },
  { id: 3, name: 'User 3' },
]

我尝试了ids.map(id => users.find(u => u.id === id)),但我认为这没有得到优化,因为我们会为每个find()

继续对同一个集合进行id

1 个答案:

答案 0 :(得分:0)

您可以创建一个Map对象,其中包含每个值的排序索引。然后,使用该排序索引对数组进行实际排序:

const ids = [5,2,3];

// Create sorting index using a Map object
// The id value is the key, the the index in that array is the value 
//   in the map and is used as the sort index
const mapIndex = new Map();
for (let [i, id] of ids.entries()) {
   mapIndex.set(id, i);
}

const users = [
  { id: 2, name: 'User 2' },
  { id: 5, name: 'User 5' },
  { id: 3, name: 'User 3' },
];

// sort using the mapIndex
users.sort((a, b) => {
    return mapIndex.get(a.id) - mapIndex.get(b.id);
});

这假设您的ids数组中没有.id个值。如果这是可能的,那么您需要定义不在ids数组中的id值的排序位置,并为排序回调中的id添加保护。