JavaScript'te bir dizide yinelenen değer nasıl sayılır


104

Şu anda böyle bir dizim var:

var uniqueCount = Array();

Birkaç adımdan sonra dizim şöyle görünür:

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

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.



@Nirk musical_coder'ın {}işlevsel programlamada olduğu gibi bir harita anlamına geldiğini varsayıyorum map.
Matt Ball

Yanıtlar:


30

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 Fiddle

İşlemi yapmak için üst düzey işlevleri de kullanabilirsiniz. Bu cevaba bakın


1
döngüden sonra ekstra if ifadesi gereksizdir ... sadece for (var i = 0; i <= array_elements.length; i++) {veya <=yerine kullanın <.
EmmaGamma

Merhaba @ Vinay, belki bana yardım edebilirsin? stackoverflow.com/questions/57819850/…
SMPLYJR

330
var counts = {};
your_array.forEach(function(x) { counts[x] = (counts[x] || 0)+1; });

9
Bu kesinlikle en basit cevap
Josh Beam

3
(sayar [x] || 0) +1 bu nasıl sayılır?
jsduniya

7
@SidBhalke: İfade eğer ayarlanmışsa counts[x] || 0değerini döndürür counts[x], aksi halde 0. Sonra bir tane ekleyin ve nesnede tekrar ayarlayın ve sayım yapılır.
Constantinius

1
@SheetJS neden olumsuz oy kullandığını merak ediyorsanız - o bendim; Mobil cihazda geziniyordum ve aslında fark etmeden düğmeyi tıkladım. Bir kez öğrendiğimde, geri dönmek için çok geçti. Bunun için özür dilerim, cevap gerçekten çok iyi. Düzenlemek isterseniz, bunu tersine çevirmekten memnuniyet duyarım.
Todor Minakov

4
Ayrıca reduce:var counts = your_array.reduce((map, val) => {map[val] = (map[val] || 0)+1; return map}, {} );
Alberto89

73

Bunun gibi 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);

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


4
@web_dev, dizideki her benzersiz öğe için bir anahtar değer çiftine sahip olacak olan count adında bir ilişkilendirilebilir dizi nesnesi oluşturur; burada anahtar benzersiz öğe değeri ve değer, sayıdır. Dizi üzerinde yineler ve her değer için değeri artırır veya anahtar değer çiftini oluşturur (var olmayan anahtarın değeri tanımsız olarak değerlendirilir, böylece || veya işleci bunun yerine sıfır alır ve 1 ekler)
robisrob

@neelmeg Belki "forEach" için tüm parametreleri yazmak daha iyi anlamaya yardımcı olur ("i" her dizi değeridir ve dizin DEĞİLDİR):uniqueCount.forEach(function(value, index) { count[value] = (count[value] || 0) + 1; });
Pedro Ferreira

Ekstra bir adım atmanın ve toplama göre sıralamanın iyi bir yolu nedir?
tremor

39

Bu (çok eski) soruya rastladım. İlginç bir şekilde en bariz ve zarif çözüm (imho) eksik: Array.prototype.reduce (...) . Tüm büyük tarayıcılar bu özelliği yaklaşık 2011'den (IE) ve hatta daha öncesinden (diğerleri) beri desteklemektedir:

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:
document.write(JSON.stringify(map));
// prints {"a": 3, "b": 2, "c": 2, "d": 2, "e": 2, "f": 1, "g": 1, "h": 3}


11

Azaltma dizisi işlevine 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));


@ İsnot2bad'in ( stackoverflow.com/a/32886673/621058 ) benimki ile neredeyse aynı olduğunu fark ettim . Sadece şişman ok fonksiyonları ve sabitler kullanmak olur
dinigo

9

Basit daha iyidir, tek değişken, tek işlev :)

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

6

Sanırım dizide aynı değere sahip oluşumların sayılmasının en basit yolu budur.

var a = [true, false, false, false];
a.filter(function(value){
    return value === false;
}).length                                      

6

Yanıt veren kimse bunun için Map()yerleşik olanı kullanmıyor gibi görünüyor , bu da benim yolum olma eğilimindeyken aşağıdakilerle birlikte Array.prototype.reduce():

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

Nb, eski tarayıcılarda kullanmak istiyorsanız çoklu doldurmanızMap() gerekecek .


Bunun nasıl çalıştığını biraz derinlemesine açıklayabilir misiniz? (özellikle set / get bölümü). İndirgeyiciyi bir işleve ayırmaya çalıştım ama "get" yanıt olarak bir işlev değil.
Antoine Nedelec

Tamam getve setfonksiyonlar Mapnesneden geliyor . Ancak ilk toplayıcı bir Harita nesnesi değildir, öyleyse neden azaltıcının azaltılmış versiyonu bir tane alır?
Antoine Nedelec

@AntoineNedelec başlangıç değeri olan yeni bir Mapnesne; azaltmanın ikinci argümanına bakın. Map.prototype.setharita nesnesini Map.prototype.getdöndürür undefinedve kendisine sağlanan anahtarın değerini veya değerini döndürür . Bu, her bir harfin mevcut sayısını elde etmemizi (veya 0tanımlanmamışsa), ardından bunu bir artırmamızı ve ardından bu harfin sayısını haritayı döndüren ve yeni toplayıcı değeri olan yeni sayıma ayarlamamızı sağlar.
aendrew

5

// 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]);

4

Sayım içeren bir nesneye sahip olabilirsiniz. Listede gezinin ve her bir öğenin sayısını artırın:

var counts = {};

uniqueCount.forEach(function(element) {
  counts[element] = (counts[element] || 0) + 1;
});

for (var element in counts) {
  console.log(element + ' = ' + counts[element]);
} 

neden bu koşulu belirlediniz counts[element] || 0?
AskMen

Mülkün henüz bir değeri olmadığı için counts[element]iadelere ilk kez erişiliyor undefined. Daha sonra eklemeye çalışırsanız undefined + 1, NaN elde edersiniz . (count[element] || 0)Yerini alacak undefinedolan 0ekleyerek böylece 1üretir 1yerine NaN. ECMAScript 2020, ??benzer bir şey yapan ancak birincisi undefined(veya null) olduğunda ikinci değeri kullandığı konusunda biraz daha açık olan boş birleştirme operatörünü ekler . O versiyon olurdu (counts[element] ?? 0) + 1.
nkron

4

Her biri için herhangi bir for / while döngüsü kullanmadan çözebilirsiniz.

function myCounter(inputWords) {        
    return inputWords.reduce( (countWords, word) => {
        countWords[word] = ++countWords[word] || 1;
        return countWords;
    }, {});
}

Umarım size yardımcı olur!


4

// new example.
var str= [20,1,-1,2,-2,3,3,5,5,1,2,4,20,4,-1,-2,5];

function findOdd(para) {
  var count = {};
  para.forEach(function(para) {
  count[para] = (count[para] || 0) + 1;
  });
  return count;
}

console.log(findOdd(str));


3

Bunun gibi bir şey yapabilirsiniz:

uniqueCount = ['a','b','c','d','d','e','a','b','c','f','g','h','h','h','e','a'];
var map = new Object();

for(var i = 0; i < uniqueCount.length; i++) {
 if(map[uniqueCount[i]] != null) {
    map[uniqueCount[i]] += 1;
} else {
    map[uniqueCount[i]] = 1;
    }
}

Artık tüm karakterleri içeren bir haritanız var


2

Dizi azaltma yöntemini kullanarak javascript'te basittir:

const arr = ['a','d','r','a','a','f','d'];
const result =  arr.reduce((json,val)=>({...json, [val]:(json[val] | 0) + 1}),{});
console.log(result)
//{ a:3,d:2,r:1,f:1 }


1
var uniqueCount = ['a','b','c','d','d','e','a','b','c','f','g','h','h','h','e','a'];
// here we will collect only unique items from the array
var uniqueChars = [];

// iterate through each item of uniqueCount
for (i of uniqueCount) {
// if this is an item that was not earlier in uniqueCount, 
// put it into the uniqueChars array
  if (uniqueChars.indexOf(i) == -1) {
    uniqueChars.push(i);
  } 
}
// after iterating through all uniqueCount take each item in uniqueChars
// and compare it with each item in uniqueCount. If this uniqueChars item 
// corresponds to an item in uniqueCount, increase letterAccumulator by one.
for (x of uniqueChars) {
  let letterAccumulator = 0;
  for (i of uniqueCount) {
    if (i == x) {letterAccumulator++;}
  }
  console.log(`${x} = ${letterAccumulator}`);
}

Güncellediğiniz için teşekkürler, başlangıçta olanlar için çok daha yararlı.
Normal Joe

1

Alfabe içeren bir dizide kopyalar:

var arr = ["a", "b", "a", "z", "e", "a", "b", "f", "d", "f"],
  sortedArr = [],
  count = 1;

sortedArr = arr.sort();

for (var i = 0; i < sortedArr.length; i = i + count) {
  count = 1;
  for (var j = i + 1; j < sortedArr.length; j++) {
    if (sortedArr[i] === sortedArr[j])
      count++;
  }
  document.write(sortedArr[i] + " = " + count + "<br>");
}

Sayıları içeren bir dizide kopyalar:

var arr = [2, 1, 3, 2, 8, 9, 1, 3, 1, 1, 1, 2, 24, 25, 67, 10, 54, 2, 1, 9, 8, 1],
  sortedArr = [],
  count = 1;
sortedArr = arr.sort(function(a, b) {
  return a - b
});
for (var i = 0; i < sortedArr.length; i = i + count) {
  count = 1;
  for (var j = i + 1; j < sortedArr.length; j++) {
    if (sortedArr[i] === sortedArr[j])
      count++;
  }
  document.write(sortedArr[i] + " = " + count + "<br>");
}


1

var testArray = ['a', 'b', 'c', 'd', 'd', 'e', ​​'a', 'b', 'c', 'f', 'g', 'h ',' h ',' h ',' e ',' a '];

var newArr = [];
testArray.forEach((item) => {
    newArr[item] = testArray.filter((el) => {
            return el === item;
    }).length;
})
console.log(newArr);

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

1

basitleştirilmiş sheet.js answare

var counts = {};
var aarr=['a','b','a'];
aarr.forEach(x=>counts[x]=(counts[x] || 0)+1 );
console.log(counts)


0

İyi cevapların bir kombinasyonu:

var count = {};
var arr = ['a', 'b', 'c', 'd', 'd', 'e', 'a', 'b', 'c', 'f', 'g', 'h', 'h', 'h', 'e', 'a'];
var iterator = function (element) {
    count[element] = (count[element] || 0) + 1;
}

if (arr.forEach) {
    arr.forEach(function (element) {
        iterator(element);
    });
} else {
    for (var i = 0; i < arr.length; i++) {
        iterator(arr[i]);
    }
}  

Umarım yardımcı olur.


0
public class CalculateCount {
public static void main(String[] args) {
    int a[] = {1,2,1,1,5,4,3,2,2,1,4,4,5,3,4,5,4};
    Arrays.sort(a);
    int count=1;
    int i;
    for(i=0;i<a.length-1;i++){
        if(a[i]!=a[i+1]){
            System.out.println("The Number "+a[i]+" appears "+count+" times");
            count=1;                
        }
        else{
            count++;
        }
    }
    System.out.println("The Number "+a[i]+" appears "+count+" times");

}   

}


Bunun etrafına biraz bağlam ekleyebilir misin?
Neo

0

Array.map kullanarak döngüyü azaltabiliriz, buna jsfiddle'da bakın

function Check(){
    var arr = Array.prototype.slice.call(arguments);
    var result = [];
    for(i=0; i< arr.length; i++){
        var duplicate = 0;
        var val = arr[i];
        arr.map(function(x){
            if(val === x) duplicate++;
        })
        result.push(duplicate>= 2);
    }
    return result;
}

Test Etmek İçin:

var test = new Check(1,2,1,4,1);
console.log(test);

0

var string = ['a','a','b','c','c','c','c','c','a','a','a'];

function stringCompress(string){

var obj = {},str = "";
string.forEach(function(i) { 
  obj[i] = (obj[i]||0) + 1;
});

for(var key in obj){
  str += (key+obj[key]);
}
  console.log(obj);
  console.log(str);
}stringCompress(string)

/*
Always open to improvement ,please share 
*/


0

Örneğin bir dosya oluşturun demo.jsve bunu node ile konsolda çalıştırın demo.jsve matris formunda elemanların oluşumunu elde edin.

var multipleDuplicateArr = Array(10).fill(0).map(()=>{return Math.floor(Math.random() * Math.floor(9))});
console.log(multipleDuplicateArr);

var resultArr = Array(Array('KEYS','OCCURRENCE'));

for (var i = 0; i < multipleDuplicateArr.length; i++) {
  var flag = true;
  for (var j = 0; j < resultArr.length; j++) {
     if(resultArr[j][0] == multipleDuplicateArr[i]){
       resultArr[j][1] = resultArr[j][1] + 1;
       flag = false;
      }
  }
  if(flag){
    resultArr.push(Array(multipleDuplicateArr[i],1));
  }
}

console.log(resultArr);

Konsolda aşağıdaki gibi sonuç alacaksınız:

[ 1, 4, 5, 2, 6, 8, 7, 5, 0, 5 ] . // multipleDuplicateArr
[ [ 'KEYS', 'OCCURENCE' ],        // resultArr
  [ 1, 1 ],
  [ 4, 1 ],
  [ 5, 3 ],
  [ 2, 1 ],
  [ 6, 1 ],
  [ 8, 1 ],
  [ 7, 1 ],
  [ 0, 1 ] ]

0

En hızlı yol:

Bilgisel karmaşıklık O (n) 'dir.

function howMuchIsRepeated_es5(arr) {
	const count = {};
	for (let i = 0; i < arr.length; i++) {
		const val = arr[i];
		if (val in count) {
			count[val] = count[val] + 1;
		} else {
			count[val] = 1;
		}
	}

	for (let key in count) {
		console.log("Value " + key + " is repeated " + count[key] + " times");
	}
}

howMuchIsRepeated_es5(['a','b','c','d','d','e','a','b','c','f','g','h','h','h','e','a']);

En kısa kod:

ES6 kullanın.

function howMuchIsRepeated_es6(arr) {
	// count is [ [valX, count], [valY, count], [valZ, count]... ];
	const count = [...new Set(arr)].map(val => [val, arr.join("").split(val).length - 1]);

	for (let i = 0; i < count.length; i++) {
		console.log(`Value ${count[i][0]} is repeated ${count[i][1]} times`);
	}
}

howMuchIsRepeated_es6(['a','b','c','d','d','e','a','b','c','f','g','h','h','h','e','a']);


0
var arr = ['a','d','r','a','a','f','d'];  

//call function and pass your array, function will return an object with array values as keys and their count as the key values.
duplicatesArr(arr);

function duplicatesArr(arr){
    var obj = {}
    for(var i = 0; i < arr.length; i++){
        obj[arr[i]] = [];
        for(var x = 0; x < arr.length; x++){
            (arr[i] == arr[x]) ? obj[arr[i]].push(x) : '';
        }
        obj[arr[i]] = obj[arr[i]].length;
    }

    console.log(obj);
    return obj;
}

0

arrBenzersiz kümeyi anahtar olarak tutacak bir nesne bildirin . NüfusarrHaritayı kullanarak dizi içinde döngü oluşturarak . Anahtar önceden bulunmadıysa, anahtarı ekleyin ve bir sıfır değeri atayın. Her yinelemede anahtarın değerini artırın.

Verilen testArray:

var testArray = ['a','b','c','d','d','e','a','b','c','f','g','h','h','h','e','a'];

çözüm:

var arr = {};
testArray.map(x=>{ if(typeof(arr[x])=="undefined") arr[x]=0; arr[x]++;});

JSON.stringify(arr) çıktı verecek

{"a":3,"b":2,"c":2,"d":2,"e":2,"f":1,"g":1,"h":3}

Object.keys(arr) dönecek ["a","b","c","d","e","f","g","h"]

Herhangi bir öğenin oluşumlarını bulmak için, örneğin b arr['b']çıktı verecektir2


Lütfen yanıt olarak yalnızca kod göndermeyin, aynı zamanda kodunuzun ne yaptığı ve sorunu nasıl çözdüğü hakkında bir açıklama ekleyin. Açıklamalı yanıtlar genellikle daha kalitelidir ve olumlu oylar alma olasılığı daha yüksektir.
Mark Rotteveel

0

Kullanım:

wrap.common.getUniqueDataCount(, columnName);

KOD:

function getUniqueDataCount(objArr, propName) {
        var data = [];
        objArr.forEach(function (d, index) {
            if (d[propName]) {
                data.push(d[propName]);
            }
        });

        var uniqueList = [...new Set(data)];

        var dataSet = {};
        for (var i=0; i < uniqueList.length; i++) {
            dataSet[uniqueList[i]] = data.filter(x => x == uniqueList[i]).length;
        }
        
        return dataSet;
    }

Snippet

var data= [
          {a:'you',b:'b',c:'c',d:'c'},
          {a: 'you', b: 'b', c: 'c', d:'c'},
          {a: 'them', b: 'b', c: 'c', d:'c'},
          {a: 'them', b: 'b', c: 'c', d:'c'},
          {a: 'okay', b: 'b', c: 'c', d:'c'},
          {a: 'okay', b: 'b', c: 'c', d:'c'},
          ];
          
  console.log(getUniqueDataCount(data, 'a'));       
  
  function getUniqueDataCount(objArr, propName) {
        var data = [];
        objArr.forEach(function (d, index) {
            if (d[propName]) {
                data.push(d[propName]);
            }
        });

        var uniqueList = [...new Set(data)];

        var dataSet = {};
        for (var i=0; i < uniqueList.length; i++) {
            dataSet[uniqueList[i]] = data.filter(x => x == uniqueList[i]).length;
        }

        return dataSet;
    }

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.