Javascript 优化数组与其他数组的排序
我有两个数组,一个包含一些项,另一个包含这些项的排序ID,如下所示:Javascript 优化数组与其他数组的排序,javascript,arrays,sorting,optimization,Javascript,Arrays,Sorting,Optimization,我有两个数组,一个包含一些项,另一个包含这些项的排序ID,如下所示: const items = [ { id: 1, label: 'foo' }, { id: 2, label: 'bar' }, { id: 3, label: 'lorem' }, { id: 4, label: 'ipsum' }, ] const sortedItemIds = [4, 3, 2, 1] 我希望另一个数组包含按id排序的项目,如下所示: const sortedIte
const items = [
{ id: 1, label: 'foo' },
{ id: 2, label: 'bar' },
{ id: 3, label: 'lorem' },
{ id: 4, label: 'ipsum' },
]
const sortedItemIds = [4, 3, 2, 1]
我希望另一个数组包含按id排序的项目,如下所示:
const sortedItems = [
{ id: 4, label: 'ipsum' },
{ id: 3, label: 'lorem' },
{ id: 2, label: 'bar' },
{ id: 1, label: 'foo' },
]
请注意,顺序可能不是任何形式,不是asc
或desc
我编写了这段代码,工作得很好
let sortedItems = []
sortedItemIds.map((itemId, index) => {
items.map(item) => {
if (item.id === itemId) {
sortedItems[index] = item
}
}
})
由于嵌套的array.map()
函数,我觉得我可能会遇到大量项目的问题
是否有更好的方法/最佳实践用于此场景?您不需要函数映射来执行此操作,只需使用find
数组.indexOf
和数组.sort
对其进行排序即可
const items=[{id:1,标签:'foo'},{id:2,标签:'bar'},{id:3,标签:'lorem'},{id:4,标签:'ipsum'}],
sortedItemIds=[4,3,2,1];
项目分类((a,b)=>SortedItems.indexOf(a.id)-SortedItems.indexOf(b.id));
控制台日志(项目)代码>
.as console wrapper{max height:100%!important;top:0;}
执行此操作不需要函数映射,只需使用findArray.indexOf
和Array.sort
对其进行排序即可
const items=[{id:1,标签:'foo'},{id:2,标签:'bar'},{id:3,标签:'lorem'},{id:4,标签:'ipsum'}],
sortedItemIds=[4,3,2,1];
项目分类((a,b)=>SortedItems.indexOf(a.id)-SortedItems.indexOf(b.id));
控制台日志(项目)代码>
。作为控制台包装{max height:100%!important;top:0;}
您可以创建一个对象,其中键是id,然后使用该对象按id获取值
const items=[{id:1,标签:'foo'},{id:2,标签:'bar'},{id:3,标签:'lorem'},{id:4,标签:'ipsum'}]
常量sortedItemIds=[4,3,2,1]
常量obj={}
items.forEach(o=>obj[o.id]=o);
const sortedItems=sortedItemIds.map(e=>Object.assign({},obj[e]);
log(sortedItems)
您可以创建一个对象,其中键是id,然后使用该对象按id获取值
const items=[{id:1,标签:'foo'},{id:2,标签:'bar'},{id:3,标签:'lorem'},{id:4,标签:'ipsum'}]
常量sortedItemIds=[4,3,2,1]
常量obj={}
items.forEach(o=>obj[o.id]=o);
const sortedItems=sortedItemIds.map(e=>Object.assign({},obj[e]);
console.log(sortedItems)
没有一个.map()
调用返回任何内容,因此它们不是任务的正确工具可能重复的.map()
调用没有返回任何内容,因此它们不是任务的正确工具可能重复的对象。分配({},…)
在这里似乎没有必要。OP没有提到对每个对象执行浅层克隆的任何要求,在任何情况下,Object.assign()
的使用至少应该有一个简短的解释。如果项的id
不是Int,而是字符串,该怎么办?如果是混合类型呢?别担心,我不懂你的代码。我现在觉得不错!Object.assign({},…)
在这里似乎没有必要。OP没有提到对每个对象执行浅层克隆的任何要求,在任何情况下,Object.assign()
的使用至少应该有一个简短的解释。如果项的id
不是Int,而是字符串,该怎么办?如果是混合类型呢?别担心,我不懂你的代码。我现在觉得不错!看起来这个解决方案很有效。我根据需要修改了它,添加了.slice()
,因为我不想更改第一个数组const sortedItems=items.slice().sort((a,b)=>sortedItemIds.indexOf(a.id)-sortedItemIds.indexOf(b.id))
。这一方法的效率是O(n^2 log n),而@NenadVracar的答案是~O(n),假设键查找的时间大致恒定。不完全是一个优化的实现。看起来这个解决方案工作得很好。我根据需要修改了它,添加了.slice()
,因为我不想更改第一个数组const sortedItems=items.slice().sort((a,b)=>sortedItemIds.indexOf(a.id)-sortedItemIds.indexOf(b.id))
。这一方法的效率是O(n^2 log n),而@NenadVracar的答案是~O(n),假设键查找的时间大致恒定。不完全是一个优化的实现。