繁体   English   中英

计算JavaScript数组元素的出现次数并放入新的2d数组

[英]Counting the occurrences of JavaScript array elements and put in a new 2d array

嗨,我有这样的阵列

var a = [5, 5, 5, 2, 2, 2, 2, 2, 9, 4];

我的目标是计算唯一值并报告其中的任何项目,结果很好

Array [
   [5, 3],
   [2, 5],
   [9, 1],
   [4, 1]
]

我找到了一个解决方案,可以在另一篇文章中找到[ 计算JavaScript数组元素的出现次数

@Emissary解决方案对我来说是最好的,问题是这个解决方案过去并添加一些我不需要的新功能,我不能直接回复该帖子,询问如何只有我需要的数组:d

@Emissary加了

console.log(key +':'+ val)

我的第一个想法是,而不是console.log我可以推送2d数组中的每个值,但我认为这不是一个好主意,因为如果我很了解@Emissary解决方案,那么解决方案的第一部分就是我需要的数组。

知道如何“隔离”这个特定阵列吗?

这是使用Map的理想情况,因为它通过键标识,但在转换为它时也会转换为该类型的数组:

 var a = [5, 5, 5, 2, 2, 2, 2, 2, 9, 4]; var result = [...a.reduce( (m, v) => m.set(v, (m.get(v) || 0) + 1), new Map() )]; console.log(result); 

注意,在每次迭代时执行a.filter解决方案具有O(n²)时间复杂度,而这是O(n) 您可以使用Array.from(a.reduce(....))代替spread运算符。

对于旧版浏览器,您可以使用以下变体:

 var a = [5, 5, 5, 2, 2, 2, 2, 2, 9, 4]; var obj = a.reduce( function (m, v) { return m[v] = (m[v] || 0) + 1, m }, {} ), result = []; for (var key in obj) { result.push([+key, obj[key]]); } console.log(result); 

您可以使用forEach()循环执行此操作。

 var a = [5, 5, 5, 2, 2, 2, 2, 2, 9, 4]; var result = [] a.forEach(function(e) { if (!this[e]) { this[e] = [e, 0]; result.push(this[e]) } this[e][1] ++ }, {}) console.log(result) 

您可以使用ES6的Map map并使用Array.from array.from将其转换回数组

映射类似于散列,它维护一个键值对。 不是遍历每个元素并维护计数,而是创建一个映射并设置每个事件的计数并将其转换为一个容易使用es6的数组

检查这个片段

 var a = [5, 5, 5, 2, 2, 2, 2, 2, 9, 4]; var myMap2 = new Map(); a.forEach(function(num) { if (myMap2.has(num)) { var count = myMap2.get(num); myMap2.set(num, count + 1); } else myMap2.set(num, 1); }); var arr = Array.from(myMap2); console.log(arr); 

希望能帮助到你

只需将其拉出Map构造函数即可

 var a = [5, 5, 5, 2, 2, 2, 2, 2, 9, 4]; var aCount = [...new Set(a)].map( x => [x, a.filter(y => y === x).length] ); console.log(aCount); 

您可以使用扩散语法Emissary解决方案来获得具有所需结果的数组。

 var a = [5, 5, 5, 2, 2, 2, 2, 2, 9, 4]; var aCount = [... new Map([... new Set(a)].map( x => [x, a.filter(y => y === x).length] ))]; console.log(aCount); 

这里有很好的解决方案,但只是为了您可能会做出各种各样的解决方案,同时将结果排序

 var a = [5, 5, 5, 2, 2, 2, 2, 2, 9, 4], thing = a.reduce((p,c) => (p[c] ? p[c]++ : p[c] = 1,p),[]) .reduce((p,c,i) => c ? (p.push([i,c]),p) : p ,[]); console.log(thing); 

好的......有人可能会抱怨根据原始数字生成一个巨大的稀疏数组的可能性,但是不用担心...... for循环可以解决这个问题 所以让我们再做一次......

 var a = [5, 5, 5, 2, 2, 2, 2, 2, 9, 4], sparse = a.reduce((p,c) => (p[c] ? p[c]++ : p[c] = 1,p),[]), dense = []; for (var key in sparse) dense.push([+key,sparse[key]]); console.log(dense); 

值得注意的是,当与map结合使用以转换输出列时,在评估文本中的单词出现次数/频率(通常是单词包)时, reducespread syntax解决方案也非常有效:

 var r,words="We don't talk anymore\\nWe don't talk anymore\\nWe don't talk anymore\\nLike we used to do\\nWe don't love anymore\\nWhat was all of it for?\\nOh, we don't talk anymore\\nLike we used to do\\n\\nI just heard you found the one you've been looking\\nYou've been looking for" words=words.split(/['\\s]+/g); r=[...words.reduce( (m, v) => m.set(v, ((m.get(v) || 0) + 1)), new Map() )].map(e=>[e[0],e[1]/words.length]) console.log(r) 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM