2016-10-11 4 views
2

Ich hoffe, eine effiziente Antwort wie in der zweiten Antwort (Rajesh Dhiman) in Jquery Count number of occurances in arrayWie kann ich das Auftreten eines Wertes eines Attributs in einer Reihe von anonymen zählen Objekten

Javascript von JQuery zu finden sind beide akzeptabel.

Bedenken Sie:

var items = new Array(); 
items.push({x: 1, y: "what"}); 
items.push({x: 3, y: "ever"}); 
items.push({x: 4, y: "can"}); 
items.push({x: 4, y: "happen"}); 
items.push({x: 1, y: "will"}); 
items.push({x: 4, y: "happen"}); 

Sucht Ergebnisse wie (sortiert oder nicht spielt keine Rolle):

res = {1:2, 3:1, 4:3} 

Alle anderen Antworten in Bezug auf hier, dass ich stark vereinfachten Arrays nur betrachten Zählen finden kann oder nicht JS/JQ.

+0

Genau diesen Gedanken hatte. Was, wenn ich wollte, resultiere in einem Array von anonymen Objekten wie 'result = ({x: 1, y: 2}, {x: 3, y: 1}, {x: 4, y: 3})'? @Nenad Vracar @NinaScholz – Steve

+0

für jetzt bin ich nur repassessing 'result' als' var res = new Array(); \t Object.getOwnPropertyNames (Ergebnis).forEach (Funktion (val, idx, Array)) { \t \t res.push ({x: val, cnt: Ergebnis [val]}); \t}); \t console.log (res); ' – Steve

Antwort

4

Sie können reduce() verwenden und das Objekt als Ergebnis zurückgeben.

var items = new Array(); 
 
items.push({x: 1, y: "what"}); 
 
items.push({x: 3, y: "ever"}); 
 
items.push({x: 4, y: "can"}); 
 
items.push({x: 4, y: "happen"}); 
 
items.push({x: 1, y: "will"}); 
 
items.push({x: 4, y: "happen"}); 
 

 
var result = items.reduce(function(r, o) { 
 
    r[o.x] = (r[o.x] || 0) + 1; 
 
    return r; 
 
}, {}) 
 

 
console.log(result)

+0

DUH! :-) Danke, Mann! Und für dich schnelle Antwort. – Steve

+0

Ich hatte gerade diesen Gedanken. Was, wenn ich wollte, resultiere in einem Array von anonymen Objekten wie 'result = ({x: 1, y: 2}, {x: 3, y: 1}, {x: 4, y: 3})'? – Steve

+0

Dann würde Ihr Code wie folgt gehen https://jsfiddle.net/Lg0wyt9u/1267/ –

2

Keine Notwendigkeit für Array#reduce, ein Array#forEach gut funktioniert.

Das Ergebnis ist ein Objekt. Die Referenz ändert sich nicht, daher ist es nicht notwendig, etwas zu verwenden, das den Verweis auf ein Ergebnis ändert.

Wenn zum Beispiel ein Ergebnis aus einer fortlaufenden Addition gebildet wird, dann würde sich das Ergebnis ändern, aber hier ändert sich das Ergebnis bei einem Objekt nicht. Es ist eher eine Art Faulheit, ein Objekt durch das Reduzieren zu bewegen.

var items = [{ x: 1, y: "what" }, { x: 3, y: "ever" }, { x: 4, y: "can" }, { x: 4, y: "happen" }, { x: 1, y: "will" }, { x: 4, y: "happen" }], 
 
    count = Object.create(null); 
 

 
items.forEach(function(a) { 
 
    count[a.x] = (count[a.x] || 0) + 1; 
 
}); 
 

 
console.log(count);

Wie für die Zählung mit einem Array von Objekten angefordert. Dieser Vorschlag verwendet das this Objekt, das die enthaltenen Elemente in der Ergebnismenge hasht.

var items = [{ x: 1, y: "what" }, { x: 3, y: "ever" }, { x: 4, y: "can" }, { x: 4, y: "happen" }, { x: 1, y: "will" }, { x: 4, y: "happen" }], 
 
    result = []; 
 

 
items.forEach(function(a) { 
 
    if (!this[a.x]) { 
 
     this[a.x] = { x: a.x, cnt: 0 }; 
 
     result.push(this[a.x]); 
 
    } 
 
    this[a.x].cnt++; 
 
}, Object.create(null)); 
 

 
console.log(result);

Mit Array#reduce, eine Hash-Tabelle als Verschluss und einem Array.

var items = [{ x: 1, y: "what" }, { x: 3, y: "ever" }, { x: 4, y: "can" }, { x: 4, y: "happen" }, { x: 1, y: "will" }, { x: 4, y: "happen" }], 
 
    result = items.reduce(function (hash) { 
 
     return function(r, a) { 
 
      if (!hash[a.x]) { 
 
       hash[a.x] = { x: a.x, cnt: 0 }; 
 
       r.push(hash[a.x]); 
 
      } 
 
      hash[a.x].cnt++; 
 
      return r; 
 
     }; 
 
    }(Object.create(null)), []); 
 

 
console.log(result);

+0

Was wäre eine gegenteilige Bemerkung zur Verwendung von reduce? – Steve

+0

Gleiche Anzahl von Zeilen. Wäre nur eine Lesbarkeitspräferenz an diesem Punkt. Wie würden sich die Aufführungen vergleichen? – Jecoms

+0

Ich denke, leistungsfähig sollte ich hinzufügen, dass das Array nur maximal 70 Objekte haben wird. Typisch um 35 ~ 40. Mit anderen Worten sehr klein. – Steve

0

Eine schnelle und sortiert Lösung:

var items = new Array(); 
items.push({x: 1, y: "what"}); 
items.push({x: 3, y: "ever"}); 
items.push({x: 4, y: "can"}); 
items.push({x: 4, y: "happen"}); 
items.push({x: 1, y: "will"}); 
items.push({x: 4, y: "happen"}); 
var res = items.map(x => ({x: x.x})).sort((a,b) => a.x - b.x).reduce((r,o) => { 
    r[o.x] = (r[o.x] || 0) + 1; 
    return r; 
}, {}); 
console.log(res); //{ '1': 2, '3': 1, '4': 3 } 
0

Ein anderer Ansatz wäre, darüber zu iterieren und die Vorkommen zu finden. Unten ist der Code und die Demo.

var items = new Array(); 
 
items.push({x: 1, y: "what"}); 
 
items.push({x: 3, y: "ever"}); 
 
items.push({x: 4, y: "can"}); 
 
items.push({x: 4, y: "happen"}); 
 
items.push({x: 1, y: "will"}); 
 
items.push({x: 4, y: "happen"}); 
 
var returnobj = {}; 
 

 
$.each(items, function(key, value) { 
 
    if (returnobj.hasOwnProperty([value['x']])) { 
 
    returnobj[value['x']] = returnobj[value['x']] + 1; 
 
    } else { 
 
    returnobj[value['x']] = 1; 
 
    } 
 
}); 
 
console.log(returnobj);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

Verwandte Themen