JavaScript中的reduce方法中initialValue为空对象,这是什么意思?

4
在 MDN Array.prototype.reduce() 中,allNames[name] 是什么意思?allNames 应该首先是一个空对象{},但如果对象是空的,allNames[name] = 1 等同于 {}['Alice'] = 1 吗?它如何变成{ 'Alice': 1},我很困惑。
Counting instances of values in an object

var names = ['Alice', 'Bob', 'Tiff', 'Bruce', 'Alice'];

var countedNames = names.reduce(function (allNames, name) { 
  if (name in allNames) {
    allNames[name]++;
  }
  else {
    allNames[name] = 1;
  }
  return allNames;
}, {});
// countedNames is:
// { 'Alice': 2, 'Bob': 1, 'Tiff': 1, 'Bruce': 1 }

1
初始对象是您开始使用并返回的对象。 - Mr. Polywhirl
1
allNames[name] = 1name 的内容作为新属性添加到 allNames 中,并立即将值 1 存储在该新添加的属性中 -> 使用对象 - JavaScript | MDN - Andreas
你能提供一下所讨论的 MDN 页面链接吗?看起来 allNames[name] 是一个控制变量,用于计算某个名称被发现的次数。 - Marco
这是 reduce 的语法:arr.reduce(callback(accumulator, currentValue[, index[, array]])[, initialValue])。当数组为空时,无法执行任何 reduce 操作。 - Raju Melveetilpurayil
分解它。{}['Alice'] = 1; {} 是一个空对象。['Alice'] 获取或设置该对象上命名为"Alice"的属性(在这种情况下,因为有= 1,所以是设置)。= 1将属性设置为1。因此,该操作的结果是具有Alice属性等于1的对象,即{ Alice: 1 } - Heretic Monkey
3个回答

3

Array#reduce 是一个聚合或累加器函数。这意味着它将一组项目(names)压缩为单个“累计”值(allNames)。

names.reduce(function (allNames, name) {  // `allNames` is the accumulated value, `name` is the current item in `names`
  if (name in allNames) {
    allNames[name]++;
  }
  else {
    allNames[name] = 1;
  }
  return allNames;
}, {}); // The empty object here is the initial value of the accumulated value

此函数创建一个累加值,其中每个名字在names中都对应一个键,并且对应于names中该name的频率。

最后请注意:对象具有索引符号用于属性访问/创建(与数组非常相似!)。因此,以下内容表示“如果这样的属性在对象allNames上尚不存在,则创建一个名称为变量name的属性,并将值1分配给其值:

allNames[name] = 1

1
谢谢,你是对的!我知道这是什么了,应该是括号表示法。 - GodAmongUs

1

根据您提供的文档:

reducer函数接受四个参数: 累加器(acc) 当前值(cur) 当前索引(idx) 源数组(src)

因此,第一个变量是累加器,一个变量,它将保存最终计算的累积值,就像在这个示例中你正在累积名称一样。


-1

上面的reduce函数可以重写为以下函数。

这个简化版本显示我们通过增加name的值来修改结果(从{}开始)。

如果result[item]未定义,则使用零。

const names = [ 'Alice', 'Bob', 'Tiff', 'Bruce', 'Alice' ];

const frequencyMap = (items) => items.reduce((result, item) =>
  ({ ...result, [item]: (result[item] || 0) + 1 }), {});

console.log(frequencyMap(names));
.as-console-wrapper { top: 0; max-height: 100% !important; }

这是没有使用 reduce 的真正长版本。

const names = [ 'Alice', 'Bob', 'Tiff', 'Bruce', 'Alice' ];

const frequencyMap = {};
for (let i = 0; i < names.length; i++) {
  const name = names[i],
        prev = frequencyMap[name];
  if (prev !== undefined) {
    frequencyMap[name] += 1; // Increment value by 1
  } else {
    frequencyMap[name] = 1;  // Initial value
  }
}

console.log(frequencyMap);
.as-console-wrapper { top: 0; max-height: 100% !important; }


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接