首页 > 解决方案 > 寻找优雅/简洁的方式在 JavaScript 中构建哈希表(即频率)

问题描述

我正在寻找一种简洁的方法来从 JavaScript 中的数组(数字)构建哈希表。

(这出现了很多,至少在很多 O(n^2) 类型的问题上,这些问题可以优化为一次性运行,比如 Leetcode 类型的“算法”问题。)

看起来它可能是一个简洁的单行......但这是我所拥有的两行:

const freq = {}; // An Object is often used to implement a Hash Table in JavaScript
nums.forEach(num => freq[num] = freq[num] === undefined ? 1 : freq[num] + 1);

...假设nums是一个Array<number>和频率代表一个概念性的哈希表数据结构,像这样:

const nums = [2, 0, 2, 0, 0, 3, 0, 2, 0, 1];
// freq == { '0': 5, '1': 1, '2': 3, '3': 1 }

有人知道实现这一目标的更简洁的语法方式吗?

标签: javascriptarraysdictionaryhashtable

解决方案


可以使用reduce一些逗号运算符(ab) 来做到这一点,但坦率地说,我想不出一个很好的理由。:-) 它看起来像这样:

const freq = nums.reduce((acc, num) => (acc[num] = (acc[num] || 0) + 1, acc), {});

现场示例:

const nums = [2, 0, 2, 0, 0, 3, 0, 2, 0, 1];
const freq = nums.reduce((acc, num) => (acc[num] = (acc[num] || 0) + 1, acc), {});
console.log(freq);


推荐阅读