我想只返回匹配的项目,我解决了这个问题创建我自己的高阶函数,我想以一个完全功能的方式解决这个问题。
是否有任何类似的javascript函数可以完成我的函数正在做的事情?看下面的例子,我写了一些基于Jest的例子,以方便我所期待的。
该函数将尝试find
的值,直到与undefined不同。如果这种功能不存在,你们想到尝试在JavaScript上实现它,或许提出一个tc39提案?有人和我以前有同样的问题吗?
我知道Array.prototype.find
是如何工作的以及为什么它被链接以获得深层元素时不起作用。
我想要满足一些条件:
undefined
不同的条件来退出for
循环。find
,map
,filter
和reduce
,如下所示:fn(collection[i], index, collection)
。const findItem = (collection, fn) => {
for (let i = 0; i < collection.length; i++) {
const item = fn(collection[i], i, collection)
if (item !== undefined) return item
}
return undefined
}
let groups = [
{ items: [{ id: 1 }, { id: 2 }] },
{ items: [{ id: 3 }, { id: 4 }] },
]
var result = findItem(groups, group =>
findItem(group.items, item => item.id === 4 ? item : undefined))
// works!
expect(result).toEqual(groups[1].items[1])
// Array.prototype.find
var result2 = groups.find(group =>
group.items.find(item => item.id === 4 ? item : undefined))
// returns groups[1], don't work! And I know why it does not work.
expect(result2).toEqual(groups[1].items[1])
可能很可怕,但你可以利用reduce
功能中的后门,让你在比赛的早期退出
let groups = [
{ items: [{ id: 1 }, { id: 2 }] },
{ items: [{ id: 3 }, { id: 4 }] },
];
const item = groups.slice(0).reduce((val, g, i, arr) => {
for (const item of g.items) {
if (item.id === 4) {
val = item;
arr.splice(1); // exit
}
}
return val;
}, null);
item && console.log(item);
注意 - 使用slice
是为了确保原始数组不会发生变异