在新数组不能正确执行时减少

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

我需要不在数组的成员上执行reduce函数,而只在索引上执行。我尝试了以下方法。

const len = 4;
const arr = new Array(len);
const total = arr.reduce((accum, dummy, index) => calculate(accum, index), 0);

这行不通 我试着添加了一些打印输出,似乎reduce语句中的函数永远不会被调用。

然而,如果我将arr替换为:

const arr = [0,1,2,3];

那么它就能正常工作。我缺少了什么?我使用的数组的长度确实被验证为4,那么为什么它没有像应该的那样执行函数4次?

javascript arrays reduce
1个回答
3
投票

new Array(len) 创建一个带有 length 的财产 len 任何数组的索引 own-properties。

const arr = new Array(3);
console.log(arr.hasOwnProperty(1));

这就是所谓的 稀疏数组,几乎总是应该避免,因为创建它们会产生像你正在经历的奇怪的结果。你可以 .fill 数组,使每个数组的索引值从0至 length - 1 的值。

const arr = new Array(3).fill(0);
console.log(arr.hasOwnProperty(1));

那么 reduce 将能够对数组进行迭代。

由于 规格 说。

9. Repeat, while k < len,
  a. Let Pk be ! ToString(k).
  b. Let kPresent be ? HasProperty(O, Pk).
  c. ****If kPresent is true, then*****
    i. Let kValue be ? Get(O, Pk).
    ii. Set accumulator to ? `Call(callbackfn, undefined, « accumulator,   d. kValue, k, O »)`.

由于一个备用数组 有任何数组索引的自身属性,则在 .reduce 回调 calllbackfn 在规范中)从未被调用。

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