2013-02-24 67 views
13

在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

复制和排序听起来像是一个很好的解决方案。你为什么要避免这种情况? – Bergi 2013-02-24 14:32:17

+2

您可以推送字典中的元素并计算键的数量。 – zsong 2013-02-24 14:34:59

+0

我只是想知道解决这个问题的方法。我只是好奇。其次,它混淆了其他元素依赖的原始数组。我可能会更好地将数组转换为对象。但我不知道某种物体的各个部分会发生什么。 – 2013-02-24 14:36:14

回答

30

快速的方法是将独特的元素复制到对象中。

var counts = {}; 
for (var i = 0; i < arr.length; i++) { 
    counts[arr[i]] = 1 + (counts[arr[i]] || 0); 
} 

当该环是完全的counts对象将有所述阵列的每个不同的元件的计数。

+0

只有独特元素是字符串(或转换为唯一字符串) – Bergi 2013-02-24 15:04:13

+2

@Bergi被授予,但它们在OP的示例中。 – kojiro 2013-02-24 15:08:00

+0

如果你的意思是'jam','beef','cream'和'jam',它们是OPs例子中的变量。我们不知道它们包含什么 – Bergi 2013-02-24 16:02:31

5

这种表达给你的阵列中的所有独特的元素,而变异是:

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给出计数。

+0

'filter'和'[last] indexOf'都需要JavaScript 1.6。这个答案可以使用一些解释性评论。 – kojiro 2013-02-24 14:36:46

+1

过滤器回调应该返回一个布尔值,而不是元素。并且您的for-each循环与OPs原始脚本不一样 – Bergi 2013-02-24 15:02:58

7

快速的方法是用new Set() object

设置很棒,我们应该更频繁地使用它们。它们速度很快,并且受Chrome,Firefox,Microsoft Edge和node.js的支持。 。
- What is faster Set or Object?由安德烈Kashcha

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

这可以用来计数任何iterable的项目(包括氩ray,String,TypedArray和arguments对象)。

0

为什么不一样的东西:

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)

纯JavaScript,在O(n)的运行。除非您的唯一值数量等于元素数量(所有元素都是唯一的),否则不会消耗太多空间。

相关问题