在JavaScript中是否有一个find函数返回函数返回的内容,而不是当值为真时返回整个项目

问题描述 投票:0回答:1

我想只返回匹配的项目,我解决了这个问题创建我自己的高阶函数,我想以一个完全功能的方式解决这个问题。

是否有任何类似的javascript函数可以完成我的函数正在做的事情?看下面的例子,我写了一些基于Jest的例子,以方便我所期待的。

该函数将尝试find的值,直到与undefined不同。如果这种功能不存在,你们想到尝试在JavaScript上实现它,或许提出一个tc39提案?有人和我以前有同样的问题吗?

我知道Array.prototype.find是如何工作的以及为什么它被链接以获得深层元素时不起作用。

我想要满足一些条件:

  1. 返回我的函数返回的内容,而不是整个项目,如果它是真的。
  2. 出于性能原因,当找到值时,不需要在数组中保持循环,在下面的示例中,我使用了与undefined不同的条件来退出for循环。
  3. 遵循其他高阶函数的标准,如findmapfilterreduce,如下所示: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]) 

javascript node.js algorithm
1个回答
0
投票

可能很可怕,但你可以利用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是为了确保原始数组不会发生变异

© www.soinside.com 2019 - 2024. All rights reserved.