gpt4 book ai didi

javascript - "Filter"或 "Map"使用不同测试的同一数组而不循环多次?

转载 作者:行者123 更新时间:2023-11-28 19:46:08 27 4
gpt4 key购买 nike

例如我有

var nums = [1,2,3,4,5,6,7,8,9];

有没有办法这样写:

var multiplesOf2 = nums.filter(...)
var multiplesOf3 = nums.filter(...)
var greaterThan7 = nums.filter(...)

并使其高效

var multiplesOf2 = [], multiplesOf3 = [], greaterThan7  = [];
nums.forEach(function (num) {
if (...) { multiplesOf2.push(num); }
if (...) { multiplesOf3.push(num); }
if (...) { greatherThan7.push(num); }
})

最佳答案

这是一种方法:

var LazyArray = defclass({
constructor: function (xs) {
this.xs = xs;
this.fs = [];
},
iterate: function () {
var xs = this.xs, m = xs.length;
var fs = this.fs, n = fs.length;

for (var i = 0; i < m; i++) {
var x = xs[i];

for (var j = 0; j < n; j++) {
var f = fs[j], p = f(x, i, xs);
if (p) fs.splice(j--, 1), n--; // break out of the loop
}
}

fs.length = 0;
},
filter: function (f) {
var ys = [];

this.fs.push(function (x) {
if (f(x)) ys.push(x);
});

return ys;
}
});

使用方法如下:

var nums = new LazyArray([1,2,3,4,5,6,7,8,9]);

var multiplesOf2 = nums.filter(...);
var multiplesOf3 = nums.filter(...);
var greaterThan7 = nums.filter(...);

nums.iterate();

但请注意,在性能方面并没有真正的好处。如果输入数组有 m 个项目,并且有 n 次调用 filter,则:

  1. 传统上,您会循环遍历 m 个项目 n 次。
  2. 在本例中,您将循环 n 个迭代器 m 次。

无论哪种情况,时间复杂度都是O(m * n)。惰性求值并没有真正的好处,除非您可以跳过一些计算,否则您不必使用严格求值来执行这些计算。

附注您可以轻松地使用 mapreduce 等函数扩展 LazyArray 类。

<小时/>

编辑:我忘记了defclass的定义:

function defclass(prototype) {
var constructor = prototype.constructor;
constructor.prototype = prototype;
return constructor;
}

这就是大家。

关于javascript - "Filter"或 "Map"使用不同测试的同一数组而不循环多次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24255183/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com