在JavaScript中,以下内容将查找数组中的元素数。假设数组中至少有一个元素
arr = ["jam", "beef", "cream", "jam"]
arr.sort();
var count = 1;
var results = "";
for (var i = 0; i < arr.length; i++)
{
if (arr[i] == arr[i+1])
{
count +=1;
}
else
{
results += arr[i] + " --> " + count + " times\n" ;
count=1;
}
}
是否可以在不使用sort()或不以任何方式改变数组的情况下执行此操作?我想可能必须重新创建数组,然后可以在新创建的数组上完成排序,但我想知道没有排序的最佳方法是什么。 是的,我是一个艺术家,而不是程序员,你的荣誉。
答案 0 :(得分:39)
快速执行此操作的方法是将唯一元素复制到对象中。
var counts = {};
for (var i = 0; i < arr.length; i++) {
counts[arr[i]] = 1 + (counts[arr[i]] || 0);
}
当这个循环完成时,counts
对象将拥有数组中每个不同元素的计数。
答案 1 :(得分:25)
快速执行此操作的方法是new Set()
object。
集非常棒,我们应该更频繁地使用它们。它们很快,并受Chrome,Firefox,Microsoft Edge和node.js的支持 - Andrei Kashcha的 What is faster Set or Object?
Set
中的项目始终是唯一的,因为它只保留您放入的每个值的一个副本。这是一个使用此属性的函数:
function countUnique(iterable) {
return new Set(iterable).size;
}
console.log(countUnique('banana')); //=> 3
console.log(countUnique([5,6,5,6])); //=> 2
console.log(countUnique([window, document, window])); //=> 2
&#13;
这可用于计算任何iterable中的项目(包括Array,String,TypedArray和arguments对象)。
答案 2 :(得分:7)
为什么不能这样:
var arr = ["jam", "beef", "cream", "jam"]
var uniqs = arr.reduce((acc, val) => {
acc[val] = acc[val] === undefined ? 1 : acc[val] += 1;
return acc;
}, {});
console.log(uniqs)
&#13;
Pure Javascript,在 O(n)中运行。除非您的唯一值的数量等于元素的数量(所有元素都是唯一的),否则不会占用太多空间。
答案 3 :(得分:6)
此表达式为您提供数组中的所有唯一元素,而不会对其进行变更:
arr.filter(function(v,i) { return i==arr.lastIndexOf(v); })
您可以使用此表达式对其进行链接,以构建您的结果字符串而不进行排序:
.forEach(function(v) {
results+=v+" --> " + arr.filter(function(w){return w==v;}).length + " times\n";
});
在第一种情况下,过滤器仅包括每个特定元素的最后一个;在第二种情况下,过滤器包括该类型的所有元素,.length
给出计数。
答案 4 :(得分:3)
与this solution相同,但是代码更少。
let counts = {};
arr.forEach(el => counts[el] = 1 + (counts[el] || 0))
答案 5 :(得分:0)
function reomveDuplicates(array){
var newarray = array.filter( (value, key)=>{
return array.indexOf(value) == key
});
console.log("newarray", newarray);
}
reomveDuplicates([1,2,5,2,1,8]);
使用时间复杂度为 O(n) 的 hash Map
function reomveDuplicates(array){
var obj ={};
let res=[];
for( arg of array){
obj[arg] = true;
}
console.log(Object.keys(obj));
for(key in obj){
res.push(Number(key)); // Only if you want in Number
}
console.log(res);
}
reomveDuplicates([1,2,5,2,1,8]);