So zählen Sie doppelte Werte in einem Array in Javascript

97

Derzeit habe ich ein Array wie dieses:

var uniqueCount = Array();

Nach ein paar Schritten sieht mein Array folgendermaßen aus:

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

Wie kann ich zählen, wie viele a, b, c sich im Array befinden? Ich möchte ein Ergebnis haben wie:

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

etc.

detno29
quelle
1
Mögliches Duplikat von stackoverflow.com/questions/12749200/…
Vinay Pratap Singh
@Nirk Ich nehme an, dass musical_coder eine Map wie in bedeutete {}, keine funktionale Programmierung map.
Matt Ball

Antworten:

26

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 Geige

Sie können auch Funktionen höherer Ordnung verwenden, um die Operation auszuführen. Siehe diese Antwort

Vinay Pratap Singh
quelle
1
Die zusätzliche if-Anweisung nach der Schleife ist nicht erforderlich. Verwenden Sie einfach for (var i = 0; i <= array_elements.length; i++) {oder <=anstelle von <.
EmmaGamma
Hallo @Vinay, vielleicht könntest du mir hier helfen? stackoverflow.com/questions/57819850/…
SMPLYJR
318
var counts = {};
your_array.forEach(function(x) { counts[x] = (counts[x] || 0)+1; });
SheetJS
quelle
9
Dies ist definitiv die einfachste Antwort
Josh Beam
3
(zählt [x] || 0) +1 wie wird dies gezählt?
jsduniya
5
@SidBhalke: Der Ausdruck counts[x] || 0gibt den Wert von zurück, counts[x]wenn er andernfalls festgelegt ist 0. Fügen Sie dann einfach eine hinzu und setzen Sie sie erneut in das Objekt. Die Zählung ist abgeschlossen.
Constantinius
1
@SheetJS, wenn Sie sich fragen, warum die Ablehnung - ich war es; Ich habe auf dem Handy gebrowst und auf die Schaltfläche geklickt, ohne es tatsächlich zu bemerken. Als ich herausfand, dass es zu spät war, um zurückzukehren. Entschuldigung dafür, die Antwort ist wirklich gut. Wenn Sie es bearbeiten möchten, würde ich gerne rückgängig machen.
Todor Minakov
4
Auch mit reduce:var counts = your_array.reduce((map, val) => {map[val] = (map[val] || 0)+1; return map}, {} );
Alberto89
70

Etwas wie das:

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

Verwenden Sie eine einfache for-Schleife anstelle von forEach, wenn dies in älteren Browsern nicht unterbrochen werden soll.

loxxy
quelle
4
@web_dev Er erstellt ein assoziatives Array-Objekt namens count, das für jedes eindeutige Element im Array ein Schlüsselwertpaar enthält, wobei der Schlüssel der eindeutige Elementwert und der Wert die Anzahl ist. Er iteriert über das Array und erhöht für jeden Wert entweder den Wert oder erstellt das Schlüsselwertpaar (der Wert des nicht vorhandenen Schlüssels wird als undefiniert ausgewertet, sodass der Operator || oder stattdessen eine Null nimmt und die 1 hinzufügt)
robisrob
@neelmeg Vielleicht hilft das Schreiben aller Parameter für "forEach" besser zu verstehen ("i" ist jeder Array-Wert und NICHT der Index):uniqueCount.forEach(function(value, index) { count[value] = (count[value] || 0) + 1; });
Pedro Ferreira
37

Ich bin über diese (sehr alte) Frage gestolpert. Interessanterweise fehlt die offensichtlichste und eleganteste Lösung (imho): Array.prototype.reduce (...) . Alle gängigen Browser unterstützen diese Funktion seit etwa 2011 (IE) oder noch früher (alle anderen):

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
quelle
10

Einzelne Zeile basierend auf der Array-Funktion reduzieren

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
quelle
Ich habe gerade festgestellt, dass @ isnot2bad ( stackoverflow.com/a/32886673/621058 ) fast dasselbe ist wie meins. Ich benutze zufällig fette
Pfeilfunktionen
8

Einfach ist besser, eine Variable, eine Funktion :)

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

Ich denke, dies ist der einfachste Weg, um Vorkommen mit demselben Wert im Array zu zählen.

var a = [true, false, false, false];
a.filter(function(value){
    return value === false;
}).length                                      
Dmytro Kozlovskyi
quelle
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
quelle
5

Niemand, der antwortet, scheint das Map()eingebaute Gerät dafür zu verwenden , was in der Regel meine Anlaufstelle ist, kombiniert mit 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, Sie müssen polyfill,Map() wenn Sie es in älteren Browsern verwenden möchten.

aendrew
quelle
Können Sie uns etwas näher erläutern, wie das funktioniert? (speziell das Set / Get-Teil). Ich habe versucht, den Reduzierer in eine Funktion zu zerlegen, aber ich habe "get" ist keine Funktion als Antwort.
Antoine Nedelec
Ok getund setFunktionen kommen vom MapObjekt. Der anfängliche Akkumulator ist jedoch kein Map-Objekt. Warum nimmt die reduzierte Version des Reduzierers eines?
Antoine Nedelec
@AntoineNedelec Der Anfangswert ist ein neues MapObjekt. siehe das zweite Argument der Reduzierung. Map.prototype.setGibt das Kartenobjekt zurück und Map.prototype.getgibt undefinedden Wert des Schlüssels zurück, der ihm übergeben wurde. Auf diese Weise können wir die aktuelle Anzahl jedes Buchstabens abrufen (oder, 0falls nicht definiert), diese um eins erhöhen und dann die Anzahl dieser Buchstaben auf die neue Anzahl setzen, wodurch die Karte zurückgegeben und der neue Akkumulatorwert wird.
aendrew
4

Sie können ein Objekt haben, das Zählungen enthält. Gehen Sie die Liste durch und erhöhen Sie die Anzahl für jedes Element:

var counts = {};

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

for (var element in counts) {
  console.log(element + ' = ' + counts[element]);
} 
nkron
quelle
Warum haben Sie diese Bedingung festgelegt counts[element] || 0?
AskMen
4

Sie können es lösen, ohne for / while-Schleifen oder forEach zu verwenden.

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

Hoffe es hilft dir!

Pablo Souza
quelle
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
quelle
3

Sie können so etwas tun:

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

Jetzt haben Sie eine Karte mit allen Zeichen

Rami
quelle
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
quelle
Vielen Dank für die Aktualisierung, viel hilfreicher für diejenigen, die anfangen.
Regular Joe
1

Duplikate in einem Array mit Alphabeten:

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

Duplikate in einem Array mit Zahlen:

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
quelle
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);
user6160741
quelle
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
quelle
1

vereinfachte sheet.js answare

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

ßãlãjî
quelle
0

Eine Kombination guter Antworten:

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

Hoffe es ist hilfreich.

Xiaodan Mao
quelle
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
quelle
Können Sie dazu einen Kontext hinzufügen?
Neo
0

Mit array.map können wir die Schleife reduzieren, siehe dies auf 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;
}

Zu testen:

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

Erstellen Sie beispielsweise eine Datei demo.jsund führen Sie sie in der Konsole mit dem Knoten aus. demo.jsSie erhalten dann Elemente in Form einer Matrix.

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

Sie erhalten das Ergebnis in der Konsole wie folgt:

[ 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
quelle
0

Schnellster Weg:

Die Rechenkomplexität ist 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']);

Der kürzeste Code:

Verwenden Sie 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
quelle
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;
}
Schläge
quelle
0

Deklarieren Sie ein Objekt arr, das den eindeutigen Satz als Schlüssel enthält. Füllen Sie arrdas Array einmal mit map durch. Wenn der Schlüssel zuvor nicht gefunden wurde, fügen Sie den Schlüssel hinzu und weisen Sie den Wert Null zu. Erhöhen Sie bei jeder Iteration den Wert des Schlüssels.

Gegeben testArray:

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

Lösung:

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

JSON.stringify(arr) wird ausgegeben

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

Object.keys(arr) wird zurückkehren ["a","b","c","d","e","f","g","h"]

Um das Vorkommen eines Elements zu finden, wird z. B. b arr['b']ausgegeben2

jidexl21
quelle
Bitte posten Sie nicht nur Code als Antwort, sondern geben Sie auch eine Erklärung an, was Ihr Code tut und wie er das Problem löst. Antworten mit einer Erklärung sind im Allgemeinen von höherer Qualität und ziehen eher positive Stimmen an.
Mark Rotteveel
0

Verwendung:

wrap.common.getUniqueDataCount(, columnName);

CODE:

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

ARr0w
quelle
-1

In Javascript ist es einfach, die Methode zur Array-Reduzierung zu verwenden:

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
quelle