js减少只有空值的数组

时间:2014-10-23 18:37:29

标签: javascript

为什么不迭代?

(Array(5)).reduce(function(cur,prv,n,a){alert(n)},'');

我从未到过函数体,似乎忽略了所有空值,这不是我想要它做的。

2 个答案:

答案 0 :(得分:1)

据我所知Array(5)返回Array Object的实例,其属性为length(值为5),但没有值。在这里使用reduce(或其他数组方法,如map)的一种方法是:

String(Array(5)).split(',').reduce(function (cur, prv, n, a) { /* ... */ })

另一种选择可能是:

Array.apply(null,{length: 5}).map( [callback] );
// or
Array.apply(null,Array(5)).map( [callback] );

会在某个时刻遇到最大的调用堆栈错误。字符串/拆分方法对大型数组保持工作(尽管速度稍慢)。在我的(不那么快)计算机映射Array(1000000)上使用node.js并使用字符串/ split-method持续0.47秒,同样的array.apply方法使用RangeError崩溃(最大值调用堆栈大小超过)。

您还可以编写一个'静态'数组方法来创建一个包含n个值的Array和所有可用/适用的Array方法:

Array.create = function (n, mapCB, method, initial) {
  method = method in [] ? method : 'map';
  var nwArr = ( function(nn){ while (nn--) this.push(undefined); return this; } )
                .call([], n);
  return mapCB ? nwArr[method](mapCB, initial) : nwArr;
};
// usages
Array.create(5, [callback], 'reduce', '');
Array.create(5).reduce( [callback], '');
Array.create(5).map( [callback] ).reduce( [callback] );
// etc.

答案 1 :(得分:0)

正如其他人所说的那样,reduce的实现导致它抛出一个TypeError,因为调用数组没有初始值。要初始化一个初始值为undefined并成功调用该函数的数组,请尝试以下方法:

Array.apply(undefined, Array(5)).reduce(function(cur,prv,n,a){alert(n)},'');