ti-enxame.com

Conte elementos únicos na matriz sem classificar

Em JavaScript, o seguinte encontrará o número de elementos na matriz. Supondo que haja no mínimo um elemento na matriz

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;
    }
}

É possível fazer isso sem usar sort () ou sem alterar a matriz de alguma maneira? Eu imaginaria que a matriz teria que ser recriada e, em seguida, a classificação poderia ser feita na matriz recém-criada, mas quero saber qual é a melhor maneira sem classificar. E sim, eu sou um artista, não um programador, sua honra.

22
Ghoul Fool

Uma maneira rápida de fazer isso é copiar os elementos exclusivos em um objeto.

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

Quando esse loop for concluído, o objeto counts terá a contagem de cada elemento distinto da matriz.

42
kojiro

A maneira mais rápida de fazer isso é com um objeto new Set()) .

Os conjuntos são incríveis e devemos usá-los com mais frequência. Eles são rápidos e são suportados pelo Chrome, Firefox, Microsoft Edge e node.js.
- O que é mais rápido Conjunto ou Objeto? por Andrei Kashcha

Os itens em um Set sempre serão exclusivos, pois mantém apenas uma cópia de cada valor inserido. Aqui está uma função que usa essa propriedade:

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

Isso pode ser usado para contar os itens em qualquer iterável (incluindo um objeto Array, String, TypedArray e argumentos).

33
Web_Designer

Por que não algo como:

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 puro, executado em O (n). Também não consome muito espaço, a menos que seu número de valores exclusivos seja igual ao número de elementos (todos os elementos são únicos).

8
Ayush

Essa expressão fornece todos os elementos exclusivos da matriz sem modificá-la:

arr.filter(function(v,i) { return i==arr.lastIndexOf(v); })

Você pode encadear com essa expressão para criar sua sequência de resultados sem classificar:

.forEach(function(v) {
     results+=v+" --> " + arr.filter(function(w){return w==v;}).length + " times\n";
});

No primeiro caso, o filtro leva apenas o último de cada elemento específico; no segundo caso, o filtro inclui todos os elementos desse tipo e .length dá a contagem.

6
Plynx

O mesmo que esta solução , mas com menos código.

let counts = {};
arr.forEach(el => counts[el] = 1  + (counts[el] || 0))
5
Harman Brar