Javascript'te bir dizideki çift değerleri nasıl sayılır


Şu anda elimde şöyle bir dizi var:

var uniqueCount = Array();

Birkaç adım sonra, dizim böyle görünüyor:

uniqueCount = [a,b,c,d,d,e,a,b,c,f,g,h,h,h,e,a];

Bir dizide kaç tane a, b, c olduğunu nasıl sayabilirim? Şöyle bir sonuca sahip olmak istiyorum:

a = 3
b = 1
c = 2
d = 2

vb.

Cevap #1

const counts = {};
const sampleArray = ['a', 'a', 'b', 'c'];
sampleArray.forEach(function (x) { counts[x] = (counts[x] || 0) + 1; });
console.log(counts)

Cevap #2

Böyle bir şey:

uniqueCount = ["a","b","c","d","d","e","a","b","c","f","g","h","h","h","e","a"];
var count = {};
uniqueCount.forEach(function(i) { count[i] = (count[i]||0) + 1;});
console.log(count);

Bunun eski tarayıcılarda bozulmasını istemiyorsanız, forEach yerine basit bir for döngüsü kullanın.

Cevap #3

Bu (çok eski) soruya rastladım. İlginç bir şekilde en bariz ve zarif çözüm (bana göre) eksik: Array.prototype.reduce(...). Tüm büyük tarayıcılar bu özelliği 2011 civarından itibaren (IE) veya daha önce (diğer tüm tarayıcılar) destekliyor:

var arr = ['a','b','c','d','d','e','a','b','c','f','g','h','h','h','e','a'];
var map = arr.reduce(function(prev, cur) {
  prev[cur] = (prev[cur] || 0) + 1;
  return prev;
}, {});

// map is an associative array mapping the elements to their frequency:
console.log(map);
// prints {"a": 3, "b": 2, "c": 2, "d": 2, "e": 2, "f": 1, "g": 1, "h": 3}

DÜZENLE :

Ok fonksiyonunda virgül operatörünü kullanarak, bunu tek bir satır kodda yazabiliriz:

var arr = ['a','b','c','d','d','e','a','b','c','f','g','h','h','h','e','a'];
var map = arr.reduce((cnt, cur) => (cnt[cur] = cnt[cur] + 1 || 1, cnt), {});

// map is an associative array mapping the elements to their frequency:
console.log(map);
// prints {"a": 3, "b": 2, "c": 2, "d": 2, "e": 2, "f": 1, "g": 1, "h": 3}

Ancak, bu okunması/anlaşılması daha zor olabileceğinden, muhtemelen ilk sürüme sadık kalmak gerekir.

Cevap #4

function count() {
    array_elements = ["a", "b", "c", "d", "e", "a", "b", "c", "f", "g", "h", "h", "h", "e", "a"];

    array_elements.sort();

    var current = null;
    var cnt = 0;
    for (var i = 0; i < array_elements.length; i++) {
        if (array_elements[i] != current) {
            if (cnt > 0) {
                document.write(current + ' comes --> ' + cnt + ' times<br>');
            }
            current = array_elements[i];
            cnt = 1;
        } else {
            cnt++;
        }
    }
    if (cnt > 0) {
        document.write(current + ' comes --> ' + cnt + ' times');
    }

}

count();

Demo Keman

İşlemi yapmak için daha yüksek mertebeden fonksiyonları da kullanabilirsiniz. Bu cevaba bakın

Cevap #5

Basit daha iyidir, bir değişken, bir fonksiyon :)

const arr = ["a", "b", "c", "d", "d", "e", "a", "b", "c", "f", "g", "h", "h", "h", "e", "a"];

const counts = arr.reduce((acc, value) => ({
   ...acc,
   [value]: (acc[value] || 0) + 1
}), {});

console.log(counts);

Cevap #6

// Initial array
let array = ['a', 'b', 'c', 'd', 'd', 'e', 'a', 'b', 'c', 'f', 'g', 'h', 'h', 'h', 'e', 'a'];

// Unique array without duplicates ['a', 'b', ... , 'h']
let unique = [...new Set(array)];

// This array counts duplicates [['a', 3], ['b', 2], ... , ['h', 3]] 
let duplicates = unique.map(value => [value, array.filter(str => str === value).length]);

Cevap #7

Hiç kimse cevap verirken bunun için yerleşik Map()'i kullanmıyor gibi görünüyor, bu da benim genellikle Array.prototype.reduce() ile birlikte tercih ettiğim şeydir:

const data = ['a','b','c','d','d','e','a','b','c','f','g','h','h','h','e','a'];
const result = data.reduce((a, c) => a.set(c, (a.get(c) || 0) + 1), new Map());
console.log(...result);

Not: Eski tarayıcılarda kullanmak istiyorsanız Map() için polyfill yapmanız gerekecek.

Cevap #8

Azaltma dizisi fonksiyonuna dayalı tek satır

const uniqueCount =  ["a", "b", "c", "d", "d", "e", "a", "b", "c", "f", "g", "h", "h", "h", "e", "a"];
const distribution = uniqueCount.reduce((acum,cur) => Object.assign(acum,{[cur]: (acum[cur] || 0)+1}),{});
console.log(JSON.stringify(distribution,null,2));

İlgili makaleler