Bagaimana menghitung nilai duplikat dalam array di javascript

107

Saat ini, saya mendapatkan array seperti itu:

var uniqueCount = Array();

Setelah beberapa langkah, array saya terlihat seperti itu:

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

Bagaimana saya bisa menghitung berapa banyak a, b, c yang ada dalam array? Saya ingin mendapatkan hasil seperti:

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

dll.

detno29
sumber
1
kemungkinan duplikat stackoverflow.com/questions/12749200/…
Vinay Pratap Singh
@Nirk Saya berasumsi bahwa musical_coder berarti peta {}, bukan pemrograman fungsional map.
Matt Ball

Jawaban:

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

Biola Demo

Anda juga dapat menggunakan fungsi tingkat tinggi untuk melakukan operasi. Lihat jawaban ini

Vinay Pratap Singh
sumber
1
pernyataan if tambahan setelah perulangan tidak diperlukan ... cukup gunakan for (var i = 0; i <= array_elements.length; i++) {atau <=sebagai gantinya <.
EmmaGamma
Hai @Vinay, mungkin Anda bisa membantu saya di sini? stackoverflow.com/questions/57819850/…
SMPLYJR
336
var counts = {};
your_array.forEach(function(x) { counts[x] = (counts[x] || 0)+1; });
SheetJS
sumber
9
Ini jelas merupakan jawaban paling sederhana
Josh Beam
3
(hitungan [x] || 0) +1 bagaimana ini memberi hitungan?
jsduniya
7
@SidBhalke: Ekspresi counts[x] || 0mengembalikan nilai counts[x]jika disetel, sebaliknya 0. Kemudian tambahkan satu dan atur lagi di objek dan hitungan selesai.
Constantinius
1
@SheetJS jika Anda bertanya-tanya mengapa downvote - itu saya; Saya menjelajah di perangkat seluler, dan telah mengklik tombol tanpa benar-benar menyadarinya. Begitu saya tahu sudah terlambat untuk kembali. Mohon maaf untuk itu, jawabannya sangat bagus. Jika Anda ingin mengeditnya, dengan senang hati saya akan membalikkannya.
Todor Minakov
4
Juga dengan reduce:var counts = your_array.reduce((map, val) => {map[val] = (map[val] || 0)+1; return map}, {} );
Alberto89
76

Sesuatu seperti ini:

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

Gunakan loop for yang sederhana, bukan forEach jika Anda tidak ingin ini rusak di browser lama.

loxxy.dll
sumber
4
@web_dev dia membuat objek array asosiatif yang disebut count yang akan memiliki pasangan nilai kunci untuk setiap elemen unik dalam array, di mana kuncinya adalah nilai elemen unik dan nilainya adalah hitungan. Dia mengulangi larik dan untuk setiap nilai menambah nilai atau membuat pasangan nilai kunci (nilai dari kunci yang tidak ada mengevaluasi menjadi tidak ditentukan sehingga || atau operator mengambil nol sebagai gantinya dan menambahkan 1)
robisrob
@neelmeg Mungkin menulis semua parameter untuk "forEach" membantu lebih baik untuk memahami ("i" adalah setiap nilai array dan BUKAN índex):uniqueCount.forEach(function(value, index) { count[value] = (count[value] || 0) + 1; });
Pedro Ferreira
apa cara yang baik untuk melangkah lebih jauh dan mengurutkan berdasarkan jumlah total?
tremor
41

Saya menemukan pertanyaan (sangat tua) ini. Menariknya solusi yang paling jelas dan elegan (imho) tidak ada: Array.prototype.reduce (...) . Semua browser utama mendukung fitur ini sejak sekitar 2011 (IE) atau bahkan lebih awal (semua yang lain):

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}

isnot2bad
sumber
11

Garis tunggal berdasarkan fungsi pengurangan array

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

dinigo
sumber
Saya baru menyadari bahwa @ isnot2bad ( stackoverflow.com/a/32886673/621058 ) hampir sama dengan milik saya. Saya kebetulan menggunakan fungsi dan konstanta panah lemak
dinigo
10

Sederhana lebih baik, satu variabel, satu fungsi :)

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

Saya pikir ini adalah cara termudah untuk menghitung kejadian dengan nilai yang sama dalam array.

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

Tidak ada yang menanggapi tampaknya menggunakan Map()built-in untuk ini, yang cenderung menjadi tujuan saya dikombinasikan dengan 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, Anda harus melakukan polyfillMap() jika ingin menggunakannya di browser lama.

aendrew
sumber
Bisakah Anda menjelaskan sedikit secara mendalam bagaimana ini bekerja? (Khususnya set / get part). Saya mencoba memecah peredam menjadi fungsi tetapi saya memiliki "get" bukan fungsi sebagai tanggapan.
Antoine Nedelec
Ok getdan setfungsi berasal dari Mapobjek. Tetapi akumulator awal bukanlah objek Map, jadi mengapa versi reducer membutuhkannya?
Antoine Nedelec
@AntoineNedelec Nilai awal adalahMap objek baru ; lihat argumen kedua dari pengurangan. Map.prototype.setmengembalikan objek peta, dan Map.prototype.getmengembalikan undefinedatau nilai kunci apa pun yang diberikan padanya. Ini memungkinkan kita mendapatkan jumlah saat ini untuk setiap huruf (atau 0jika tidak ditentukan), lalu menambahnya satu per satu, lalu menyetel jumlah huruf itu ke hitungan baru, yang mengembalikan peta dan menjadi nilai akumulator baru.
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]);
Erik Martín Jordán
sumber
4

Anda dapat memiliki objek yang berisi hitungan. Telusuri daftar dan tambah jumlah untuk setiap elemen:

var counts = {};

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

for (var element in counts) {
  console.log(element + ' = ' + counts[element]);
} 
nkron
sumber
mengapa Anda menetapkan kondisi ini counts[element] || 0?
AskMen
Pertama kali mengakses counts[element]pengembalian undefinedkarena properti belum memiliki nilai. Jika Anda kemudian mencoba menambahkan undefined + 1, Anda akan mendapatkan NaN . Ini (count[element] || 0)akan menggantikan undefineddengan 0jadi menambahkan 1menghasilkan 1bukan NaN. ECMAScript 2020 menambahkan operator penggabungan nullish ??yang melakukan hal serupa tetapi sedikit lebih eksplisit bahwa ia menggunakan nilai kedua ketika yang pertama adalah undefined(atau null). Versi itu akan menjadi (counts[element] ?? 0) + 1.
nkron
4

Anda dapat menyelesaikannya tanpa menggunakan for / while loop ou forEach.

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

Semoga membantu Anda!

Pablo Souza
sumber
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));

Ryan Luu
sumber
3

Anda bisa melakukan sesuatu seperti itu:

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

sekarang Anda memiliki peta dengan semua karakter dihitung

Rami
sumber
2

Sederhana dalam javascript menggunakan metode pengurangan array:

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 }

Yathin K Rao
sumber
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}`);
}
Ilya Kushlianski
sumber
Terima kasih telah memperbaruinya, jauh lebih bermanfaat bagi mereka yang baru memulai.
Joe Reguler
1

Duplikat dalam larik yang berisi huruf:

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

Duplikat dalam larik yang berisi angka:

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

Ankit Gupta
sumber
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);
pengguna6160741
sumber
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);
Muhammad Javeed
sumber
1

sheet.js answare yang disederhanakan

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

ßãlãjî
sumber
0

Kombinasi jawaban yang bagus:

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

Semoga bermanfaat.

Xiaodan Mao
sumber
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");

}   

}

Parv Johari
sumber
Bisakah Anda menambahkan beberapa konteks seputar ini?
Neo
0

Dengan menggunakan array.map kita dapat mengurangi loop, lihat ini di jsfiddle

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

Untuk mengetes:

var test = new Check(1,2,1,4,1);
console.log(test);
Ali Adravi
sumber
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 
*/

sg28
sumber
0

Buat file misalnya demo.jsdan jalankan di konsol dengan node demo.jsdan Anda akan mendapatkan kemunculan elemen dalam bentuk matriks.

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

Anda akan mendapatkan hasil di konsol seperti di bawah ini:

[ 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 ] ]
Jitendra
sumber
0

Cara tercepat:

Kompleksitas komputasi adalah O (n).

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

Kode terpendek:

Gunakan ES6.

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

Serhii Zghama
sumber
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;
}
thaps
sumber
0

Deklarasikan sebuah objek arruntuk menampung set unik sebagai kunci. Mengisi arrdengan melakukan perulangan melalui larik sekali menggunakan map. Jika kunci belum ditemukan sebelumnya, tambahkan kunci dan tetapkan nilai nol. Pada setiap kenaikan iterasi nilai kunci.

Diberikan testArray:

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

larutan:

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

JSON.stringify(arr) akan mengeluarkan

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

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

Untuk menemukan kemunculan item apapun misalnya b arr['b']akan mengeluarkan2

jidexl21
sumber
Harap jangan hanya memposting kode sebagai jawaban, tetapi sertakan juga penjelasan tentang fungsi kode Anda dan bagaimana cara menyelesaikan masalah. Jawaban dengan penjelasan biasanya berkualitas lebih tinggi dan lebih cenderung menarik suara positif.
Mark Rotteveel
0

Pemakaian:

wrap.common.getUniqueDataCount(, columnName);

KODE:

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

Potongan

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

ARr0w
sumber