首页 > 解决方案 > 如果项目存在于另一个数组中,则根据键将它们移动到数组的前面

问题描述

我正在根据另一个数组中的键对数组进行排序。如果他们找到匹配项,它会将这些项目移动到数组的前面。但我想不出一个干净的方法来做到这一点。

let myArray = [
  { id: 'a', name: 'Mal' },
  { id: 'b', name: 'Wash'},
  { id: 'c', name: 'Inara'},
  { id: 'd', name: 'Jayne'},
  ]

let sortArray = [
  { id: 'b' },
  { id: 'c' },
  { id: 'x' },
]

/* Expected result
myArray = [
  { id: 'b', name: 'Wash'},
  { id: 'c', name: 'Inara'},
  { id: 'a', name: 'Mal' },
  { id: 'd', name: 'Jayne'},
  ]
/*

有没有人知道一种方法来做到这一点,而不仅仅是循环通过它很多次?谢谢

标签: javascriptarrayssorting

解决方案


您可以创建一个Map将每个映射idsortArray它的索引。使用此优先级映射对象对第一个数组进行排序。

const array = [{ id: 'a', name: 'Mal' }, { id: 'b', name: 'Wash'}, { id: 'c', name: 'Inara'}, { id: 'd', name: 'Jayne'}],
     sortArray = [{ id: 'b' }, { id: 'c' }, { id: 'x' }],
     map = new Map( sortArray.map((o, i) => [o.id, i]) )

array.sort((a,b) => 
  ( map.has(b.id) - map.has(a.id) ) || ( map.get(a.id) - map.get(b.id) )
)

console.log(array)


推荐阅读