按属性对对象数组进行排序以匹配提供的列表

给定一个对象数组和一个值列表,我想有效地对对象进行排序,以便唯一属性的值(比如key)遵循列表中值的顺序。

所以对于一个数组:

const users = [
  { key: 'A', name: 'Alice' },
  { key: 'B', name: 'Bob' },
  { key: 'C', name: 'Charlie' },
]
const users = [
  { key: 'A', name: 'Alice' },
  { key: 'B', name: 'Bob' },
  { key: 'C', name: 'Charlie' },
]

我希望函数的行为是这样的:

sortByList(['A', 'B', 'C'], users)
// -> Objects for Alice, Bob, Charlie

sortByList(['C', 'B', 'A'], users)
// -> Objects for Charlie, Bob, Alice

sortByList(['A', 'C', 'B'], users)
// -> Objects for Alice, Charlie, Bob

我想出了一个Array::sort在数组上使用然后在Array::indexOf列表中使用的实现。

回答

由于限制,您可以保证键列表绝对等于用户数据中的键,您可以避免任何排序并创建临时映射,以生成新的“排序”数组:

const users = [
  { key: 'A', name: 'Alice' },
  { key: 'B', name: 'Bob' },
  { key: 'C', name: 'Charlie' }
]

const orderList = ['A','B','C']

const sortByList = (list, arr) => {
   const tmpMap = arr.reduce((acc, item) => {
      acc[item.key] = item
      return acc
   }, {});

   return list.map((key) => tmpMap[key])
}

console.log(
  sortByList(orderList, users)
)


以上是按属性对对象数组进行排序以匹配提供的列表的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>