使用对象作为累加器的数组减少

菜鸟

let str = "baaabbabbsbsssssabbaaaa";

有了这个

[...str].reduce((characterMap, char) => {
    if (!characterMap[char]) characterMap[char] = 1;
    else characterMap[char]++;
    return characterMap;
}, {})

我得到 { b: 8, a: 9, s: 6 }

但是当我把它缩短到这个时,

[...str].reduce((characterMap, char) => !characterMap[char] ? characterMap[char] = 1 : characterMap[char]++, {});

它打印出 1 而不是 { b: 8, a: 9, s: 6 }

为什么?

我首先使用 reduce 是错误的吗?

TJ克劳德

我如何缩短这个?

经过:

  1. 不要试图将它硬塞到一个reduce. :-)reduce在累加器值改变时适当使用在你的情况下,它没有。

  2. 不使用数组包装器。字符串是可迭代的,所以直接使用这个事实。

  3. 如果不存在,则使用功能强大的||运算符¹ 来默认字符数。

只需使用循环:

const characterMap = {};
for (const char of str) {
    characterMap[char] = (characterMap[char] || 0) + 1;
}

现场示例:

let str = "baaabbabbsbsssssabbaaaa";
const characterMap = {};
for (const char of str) {
    characterMap[char] = (characterMap[char] || 0) + 1;
}
console.log(characterMap);

但是如果你真的想使用reduce,你可以应用这个||技巧并使用一个较短的名称:

const characterMap = [...str].reduce((acc, ch) => {
    acc[ch] = (acc[ch] || 0) + 1;
    return acc;
}, {});

现场示例:

let str = "baaabbabbsbsssssabbaaaa";
const characterMap = [...str].reduce((acc, ch) => {
    acc[ch] = (acc[ch] || 0) + 1;
    return acc;
}, {});
console.log(characterMap);

您可以(ab)使用逗号运算符将其强制转换为简洁的箭头函数,但代价是可读性和可维护性(恕我直言)。

但是当我把它缩短到这个时,

[...str].reduce((characterMap, char) => !characterMap[char] ? characterMap[char] = 1 : characterMap[char]++, {});

它打印出 1 而不是 { b: 8, a: 9, s: 6 }

为什么?

因为您的回调函数返回 的结果!characterMap[char] ? characterMap[char] = 1 : characterMap[char]++,而不是对象。因此,对它的后续调用将获得该数字,而不是该对象,并且characterMap[char]始终为 false(因为1["a"]isundefined等)。


¹ (在我贫血的小博客上)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用数组作为Scala foldLeft累加器

来自分类Dev

如何使用HashMap折叠作为累加器?

来自分类Dev

使用数组reduce typescript将类型赋予累加器

来自分类Dev

用累加器遍历jQuery对象?

来自分类Dev

JS reduce:对象累加器标题

来自分类Dev

Java 8减少累加器返回类型

来自分类Dev

减少并映射到累加器上会产生堆栈溢出

来自分类Dev

使用HashBasedTable作为累加器的Guava ImmutableTable的Java 8收集器给出了IllegalAccessError

来自分类Dev

在分机上使用累加器

来自分类Dev

使用累加器的树的大小

来自分类Dev

使用累加器的树的大小

来自分类Dev

pyspark矩阵累加器

来自分类Dev

列表累加器在Erlang

来自分类Dev

列表累加器在Erlang

来自分类Dev

Erlang导致累加器

来自分类Dev

使用Clojure中的累加器进行映射?

来自分类Dev

Data.Vector,使用累加器进行映射

来自分类Dev

使用累加器遍历Node.js异步目录

来自分类Dev

F#–使用累加器映射列表

来自分类Dev

Prolog使用累加器在列表中查找元素

来自分类Dev

Haskell使用累加器与Parsec进行解析

来自分类Dev

使用累加器连接数字列表

来自分类Dev

如何使用OpenCL内核来做累加器?

来自分类Dev

使用Clojure中的累加器进行映射?

来自分类Dev

使用累加器遍历Node.js异步目录

来自分类Dev

在类的无序映射中使用滚动累加器

来自分类Dev

Groovy/Scala - 使用累加器迭代时提前中止

来自分类Dev

在 xslt 3.0 中使用累加器无法正常工作

来自分类Dev

如何在定义存储对象之外的对象中访问累加器?