Javascript 如何在lodash中对另一个列表中的列表进行排序

Javascript 如何在lodash中对另一个列表中的列表进行排序,javascript,lodash,Javascript,Lodash,列出一份清单 [ {id:'i1',value:'v1'}, {id:'i3',value:'v3'}, {id:'i4',value:'v4'}, {id:'i2',value:'v2'}, {id:'i5',value:'v5'}, ] 和另一个有序的id列表 ['i1','i2','i3','i4','i5'] 得到 如何在lodash中执行此操作?将数组转换为键为id的对象,以便更好地查找。用实际值替换有序列表中的每个元素 边缘情况:两个数组具有相同的元素 const foo = [

列出一份清单

[
{id:'i1',value:'v1'},
{id:'i3',value:'v3'},
{id:'i4',value:'v4'},
{id:'i2',value:'v2'},
{id:'i5',value:'v5'},
]
和另一个有序的id列表

['i1','i2','i3','i4','i5']
得到


如何在lodash中执行此操作?

将数组转换为键为
id
的对象,以便更好地查找。用实际值替换有序列表中的每个元素

边缘情况:两个数组具有相同的元素

const foo = [
  {id:'i1',value:'v1'},
  {id:'i3',value:'v3'},
  {id:'i4',value:'v4'},
  {id:'i2',value:'v2'},
  {id:'i5',value:'v5'},
];

const ordered = ['i1','i2','i3','i4','i5'];

const fooMap = _.keyBy(f, 'id');

const orderedFoo = ordered.map(id => fooMap[id])
方法并从iteratee函数返回id的索引位置

let sortedArray = _.sortBy(input, (v) => order.indexOf(v.id))
在哪里

input = [
  {id:'i1',value:'v1'},
  {id:'i3',value:'v3'},
  {id:'i4',value:'v4'},
  {id:'i2',value:'v2'},
  {id:'i5',value:'v5'},
]
order = ['i1','i2','i3','i4','i5']

这些列表是否始终具有相同的元素,或者可能是它们在某些元素上处于“关闭”状态?@Falk这些列表可能具有任意
id
的元素。实际上,数据列表是通过服务器的id列表查询的。但是服务器不能保证数据的顺序不会改变,所以我需要手动对数据进行排序。我认为这是一个更好的答案。谢谢大家。值得一提的是,
(v)=>order.indexOf(v.id)
被调用了N次,而
order.indexOf
的复杂性为O(N)。
let sortedArray = _.sortBy(input, (v) => order.indexOf(v.id))
input = [
  {id:'i1',value:'v1'},
  {id:'i3',value:'v3'},
  {id:'i4',value:'v4'},
  {id:'i2',value:'v2'},
  {id:'i5',value:'v5'},
]
order = ['i1','i2','i3','i4','i5']
let arr = ['i1','i2','i3','i4','i5'];
let arrObj = [
    {id:'i1',value:'v1'},   
    {id:'i3',value:'v3'},
    {id:'i4',value:'v4'},
    {id:'i2',value:'v2'},
    {id:'i5',value:'v5'}
]

console.table(arrObj);

arr.map(v => {
    arrObj.sort( v1 => { return v1.id == v ? true : false} )
})

console.table(arrObj);