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.



@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


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

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.


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}


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


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
}), {});

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                                      

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.


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

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

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!


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

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


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 }


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

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


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

sheet.js answare yang disederhanakan

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


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.


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

}   

}


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

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

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 ] ]

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


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

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


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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.