计算数组中的唯一元素而不进行排序

时间:2013-02-24 14:29:36

标签: javascript sorting

在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()或不以任何方式改变数组的情况下执行此操作?我想可能必须重新创建数组,然后可以在新创建的数组上完成排序,但我想知道没有排序的最佳方法是什么。 是的,我是一个艺术家,而不是程序员,你的荣誉。

6 个答案:

答案 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中的项目始终是唯一的,因为它只保留您放入的每个值的一个副本。这是一个使用此属性的函数:

&#13;
&#13;
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;
&#13;
&#13;

这可用于计算任何iterable中的项目(包括Array,String,TypedArray和arguments对象)。

答案 2 :(得分:7)

为什么不能这样:

&#13;
&#13;
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;
&#13;
&#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]);