35

在 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() 或不以任何方式改变数组的情况下做到这一点?我想必须重新创建数组,然后可以对新创建的数组进行排序,但我想知道不排序的最佳方法是什么。是的,我是艺术家,不是程序员,你的荣誉。

4

9 回答 9

81

最快的方法是使用new Set()object

套装很棒,我们应该更频繁地使用它们。它们速度很快,并且受到 Chrome、Firefox、Microsoft Edge 和 node.js 的支持。
什么是更快的 Set 或 Object?安德烈·卡什查

a 中的项目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

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

于 2017-06-07T06:50:48.660 回答
66

一种快速的方法是将唯一元素复制到对象中。

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

当这个循环完成时,counts对象将拥有数组中每个不同元素的计数。

于 2013-02-24T14:34:09.403 回答
18

为什么不这样:

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)中运行。除非您的唯一值数量等于元素数量(所有元素都是唯一的),否则也不会占用太多空间。

于 2018-03-07T16:09:33.987 回答
10

此解决方案相同,但代码更少。

let counts = {};
arr.forEach(el => counts[el] = 1  + (counts[el] || 0))
于 2018-08-20T23:54:56.777 回答
8

此表达式为您提供数组中的所有唯一元素,而不会对其进行变异:

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

于 2013-02-24T14:32:21.500 回答
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) 的哈希映射

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]);  
于 2021-02-22T15:09:02.103 回答
0

在一种现代、可扩展且易于阅读的方法中,这里有一个使用iter-ops库的方法:

import {pipe, distinct, count} from 'iter-ops';

const arr = ['jam', 'beef', 'cream', 'jam'];

const count = pipe(arr, distinct(), count()).first;

console.log(count); //=> 3
于 2021-11-16T18:37:10.683 回答
0
function check(arr) {
    var count = 0;

 for (var ele of arr) {
   
    if (typeof arr[ele] !== typeof (arr[ele+1])) {
      count++;
    } else {
      ("I don't know");
    }
  }
  return count;
}
于 2022-01-08T09:03:56.827 回答
0

此答案适用于初学者。试试这个方法,你可以轻松解决这个问题。您可以从此链接找到有关 reduce、filter、map 函数完整课程。

const user = [1, 2, 2, 4, 8, 3, 3, 6, 5, 4, 8, 8];

const output = user.reduce(function (acc, curr) {
    if (acc[curr]) {
        acc[curr] = ++acc[curr];
    } else {
        acc[curr] = 1;
    }
    return acc;
}, {});

console.log(output);

于 2022-02-03T16:28:40.467 回答