【发布时间】:2022-01-10 19:08:32
【问题描述】:
给定一个名为allItems 的对象数组,它是预先排序的,但不能从它包含的信息中再次排序 - 下面的reduce 函数的替代实现是什么,它将保留allItems 的排序顺序?
下面的逻辑会输出:
[{ id: 'd' }, { id: 'a' }, { id: 'b' }]
所需的输出是:
[{ id: 'a' }, { id: 'b' }, { id: 'd' }]
// NOTE: allItems is pre-sorted, but lacks the information to re-sort it
const allItems = [{id:'a'}, {id:'b'}, {id:'c'}, {id:'d'}, {id:'e'}, {id:'f'}];
const includedIds = ['d', 'a', 'b'];
// QUESTION: How to create the same output, but in the order they appear in allItems
const unsortedIncludedItems = includedIds.reduce((accumulator, id) => {
const found = allItems.find(n => n.id === id);
if (found) accumulator.push(found);
return accumulator;
}, [])
正如在回复@Ben 时提到的,出于性能原因,简单地颠倒逻辑会破坏交易。
【问题讨论】:
-
你的尝试是什么?你试过什么?
-
我在概念化阶段因为笨拙而放弃了所有想法,并转向互联网寻找建议,然后在我失败时求助于 StackOverflow。
-
如果我理解您所写的内容,您的代码将完全向后输出。所以你可以在之后反转列表。或者,您可以推到最前面(注意,这在普通 JS 列表中效率较低,您可能必须实现自己的队列)
-
@Ben 这种方法的问题在于
allItems可能包含数千个项目,而includedIds可能有十几个 - 而allItems.find()将在找到匹配项时停止。简单地反转它就可以了,除非它会对性能造成巨大的影响。抱歉,应该从一开始就提到这一点。 -
“出于性能原因,仅仅颠倒逻辑会破坏交易” - 不知道你所说的“颠倒逻辑”是什么意思?
标签: javascript arrays sorting ecmascript-6