为什么索引有时会在 reduce() 方法中意外运行?

Why does index sometimes operate unexpectedly in reduce() method?

我正在试验 .reduce(),在下面的测试代码中,我尝试将 accumulator.key[index] 设置为值 1。通过使用 console.log,我可以看到索引正在循环正确地从 0 到 3。但是我的代码只将 accumulator.key[3] 设置为值 1。前 3 accumulator.key[index] 它保留为未定义。这让我感到莫名其妙。我不明白为什么它不会将所有 4 个键都设置为 1。感谢您的帮助!

"use strict";

var testArray = ['fe', 'fi', 'fo', 'fum'];
var output;
 
output = testArray.reduce((accumulator, currentValue, index) => {
  accumulator.key = [];
  console.log(index);
  accumulator.key[index] = 1;
  return accumulator;
}, []);

console.log(output.key);

您在使用此语句的每次迭代中 accumulator.key = [] 将新的 [] 分配给 key 属性,这会删除先前的数组引用。传递一个对象而不是一个数组,并将其上的 key 属性 定义为数组。

var testArray = ['fe', 'fi', 'fo', 'fum'];
var output;
 
output = testArray.reduce((accumulator, currentValue, index) => {
  console.log(index);
  accumulator.key[index] = 1;
  return accumulator;
}, { key: [] });

console.log(output.key);

我不确定您在数组上使用 .key 的用例,但如果这是您的决定,那么就不要在每次迭代时将其初始化为数组。如果你害怕在第一次迭代中得到一个未定义的,那么使用一个后备空数组。

  accumulator.key = (accumulator.key || []);

"use strict";

var testArray = ['fe', 'fi', 'fo', 'fum'];
var output;
 
output = testArray.reduce((accumulator, currentValue, index) => {
  accumulator.key = (accumulator.key || []);
  console.log(index);
  accumulator.key[index] = 1;
  return accumulator;
}, []);

console.log(output.key);