Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
正在寻找用JavaScript(即频率)构建哈希表的优雅/简洁的方法_Javascript_Arrays_Dictionary_Hashtable - Fatal编程技术网

正在寻找用JavaScript(即频率)构建哈希表的优雅/简洁的方法

正在寻找用JavaScript(即频率)构建哈希表的优雅/简洁的方法,javascript,arrays,dictionary,hashtable,Javascript,Arrays,Dictionary,Hashtable,我正在寻找一种简洁的方法,用JavaScript从数组(数字)构建哈希表 (至少在许多O(n^2)类型的问题上会出现这种情况,这些问题可以优化为一次运行,比如Leetcode类型的“算法”问题。) 它似乎可以是一个简洁的一行。。。但这是我的两条线: const freq={};//对象通常用于在JavaScript中实现哈希表 nums.forEach(num=>freq[num]=freq[num]==未定义?1:freq[num]+1); 。。。假设nums是一个数组,freq表示概念上的

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

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

它似乎可以是一个简洁的一行。。。但这是我的两条线:

const freq={};//对象通常用于在JavaScript中实现哈希表
nums.forEach(num=>freq[num]=freq[num]==未定义?1:freq[num]+1);
。。。假设
nums
是一个
数组
,freq表示概念上的哈希表数据结构,如下所示:

constnums=[2,0,2,0,0,3,0,2,0,1];
//freq=={0':5,'1':1,'2':3,'3':1}
有人知道一种更简洁的语法方法来实现这一点吗?

你可以使用和一些(ab)用法,但坦率地说,我想不出一个好的理由。:-)看起来是这样的:

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

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

控制台日志(freq)为什么让它在语法上更简洁很重要?目标是可读性,而不是简洁性。把缩小留给缩小者吧。你给出的例子不是我想象的值哈希表的样子。但是,一般来说,您可以使用一个哈希函数返回一个字符串,然后将该字符串用作一个键,并将其放入一个值列表中,该值将哈希到同一个键。理想情况下,我希望语法简洁,而不是以性能为代价。我也希望有一定程度的可读性(但我想可读性是根据范例获得的…?)。我承认,我基本上希望能够更快地解决Leetcode/白板面试问题,特别是当涉及到非常常见的问题时,简单子问题的解决方案应该很容易理解,或者至少目的应该是。你也可以在不滥用逗号的情况下解决,以这样一些可能性为代价:
nums.reduce((acc,num)=>({…acc,[num]:(acc[num]| | 0)+1}),{})
@user3773048:该逗号运算符没有用于迭代任何内容;这只是一种组合两个表达式的方法,返回第二个表达式的值。通常,与这里一样,它将第一个表达式中的一些副作用与这里的实际值结合起来。这也可以重写为
nums.reduce((acc,num)=>{acc[num]=(acc[num]| | 0)+1;return acc},{})
,但是一个强大的约定会将这两个
-分开的语句,这将不再是一行。@ScottSauyet-关于扩展的观点很好!如果OP担心时间复杂度,可能会有问题,但无论如何,一个非常好的观点是……
reduce
不会改变Big-O的运行时间。它比for循环慢,主要是因为每次迭代都会有额外的函数调用,但在算法上并不慢。我会选择它作为更明确的代码,除非实际的性能测试表明它是我代码库中的瓶颈。我在第一条评论中的选择是不同的,因为它确实在理论上增加了算法时间。但是,如果你像你所建议的那样使用它,作为某种辅助数据结构,那么散列列表的时间可能无关紧要。@T.J.Crowder:这是我目前的风格,除非我发现代码在我的代码库中是一个实际的性能问题。出于所讨论的性能原因,我不会在公共库代码中使用它,但我发现它在大多数应用程序代码中更干净。