Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 优化数组与其他数组的排序_Javascript_Arrays_Sorting_Optimization - Fatal编程技术网

Javascript 优化数组与其他数组的排序

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

我有两个数组,一个包含一些项,另一个包含这些项的排序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 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;}
执行此操作不需要函数映射,只需使用find
Array.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),假设键查找的时间大致恒定。不完全是一个优化的实现。