JavaScript是否具备类似.NET LINQ的延迟执行集合API?
JavaScript中的延迟集合操作
我知道JavaScript的Array有map、filter这类方法,也能用reduce合并操作(虽然我不太喜欢它的语法,但确实管用)。不过下面的简单例子能证明这些方法不是延迟执行的——调用函数时就会立刻执行。
在C#里,Where、Select这类LINQ函数不会立刻执行表达式,直到真正需要的时候才会运行,而且据我所知只会分配最终的集合:
var a = new int[] { 1, 2, 3 }; var b = a.Where(q => q < 2).Select(q => q + 1); // 这里代码还没实际执行 var c = b.ToArray(); // 此时才会分配数组 // c 应该是 [ 2 ]
而下面的JavaScript代码里,我认为会实际分配两个数组,而且表达式会立刻执行:
const a = [1,2,3]; const b = a.filter(q => { console.log("filter executed"); return q < 2; }); console.log(b.constructor.name); const c = b.map(q => { console.log("map executed") return q + 1; }); console.log(c.constructor.name); // c 应该是 [ 2 ]
我找到最接近的是yield运算符,但没发现能把数组转换成这类集合/生成器的内置方法。
如果我有一个大型数组/集合,有没有能延迟执行直到实际需要的内置函数?
有时候会遇到下面这种操作场景,这时延迟执行会更有利:
var foo = bar.filter(pred1).map(q => calc(q.value)).filter(q => Boolean(q)).map(finalMap);
比如下面这个例子(但过程中会分配4个数组):
const adjustedMultiplier = [1, 1.2, 1.5, 1.7]; const data = [ { name: "Person 1", fromId: 1, score: 9, details: {} // 更多数据 }, { name: "Person 2", fromId: 1, score: 6, details: {} // 更多数据 }, { name: "Person 3", fromId: 3, score: 8, details: {} // 更多数据 }, // 更多数据 ]; const expectedResult = data .filter(q => q.fromId < 3) .map(q => ({ name: q.name, adjustedScore: q.score * adjustedMultiplier[q.fromId] })) .filter(q => q.adjustedScore >= 8); console.log(expectedResult);
内容的提问来源于stack exchange,提问作者Luke Vo
相关产品推荐
相关产品推荐

