linq.js zur Gruppe durch ein array von Objekten in javascript
Den ich nutzen möchte linq.js zu der Gruppe folgende Daten nach Datum.
data2 = [{
"date": 1399298400.0,
"adId": 1057946139383,
"impressions": 1000000
}, {
"date": 1399298400.0,
"adId": 3301784671323,
"impressions": 535714
}...... etc.
];
Hier ist mein Versuch:
var linq = Enumerable.From(data2);
data2 = linq.GroupBy(function (x) {
return x.date;
}).Select(function (x) {
return {
date: x.Key(),
impressions: x.Sum(function (y) {
return y.impressions | 0;
})
};
}).ToArray();
Aber Es funktioniert nicht korrekt, weil die Summe aller impressions
vor und nach der GroupBy
sind in der Nähe, aber nicht identisch.
Was ist der richtige Weg, um Gruppe von in linq.js in diesem Fall?
Hier ein Beispiel im fiddle mit vollen Datenbestand hier die Warnungen, die gesamten Impressionen vor und nach der Verwendung der GroupBy
.
- mir scheint, dass
| 0
ist das problem verursacht. Kopierte ich diesen code aus einem anderen stackoverflow-post. Was genau macht der| 0
tun? - Ich sollte
||
nicht|
und es bedeutet, dass, wenn das Objekt auf der linken Seite der Ausdruck istnull
Gegenzug, was ist rechts, was ist0
. - Aus Neugier dann - was nicht nur die ` zu tun?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Lösung
Können Sie dies tun, indem ein callback als Dritter parameter wie diese:
Erklärung
In
groupBy
, der Dritte parameter ermöglicht es Ihnen, ändern Sie die Ergebnisse, bevor Sie ausstrahlen:In JS, die bitweise oder-operator (ein Rohr
|
) gibt den ersten Wert, wenn es vorhanden ist, sonst gibt es den zweiten. Ohne es zu versuchen, um die Summe einer undefinierten Wert mit einem echten, zurückNaN
Ohne
| 0
würde, wäre das Ergebnis wie folgt Aussehen:In diesem Beispiel wird die Kurzform der syntax, aber wenn Sie bevorzugen, wenn Sie sehen, eine Zeichenfolge, die mit einem dollar-Zeichen, können Sie ersetzen Sie es mit der lambda-syntax wie folgt aus (beide tun das gleiche):
Arbeiten demo mit Stapel-Snippets:
JS:
HTML:
Weiter Lesen:
Ich bin der Autor der open-source-Projekt http://www.jinqJs.com. Sie können ganz einfach tun, dass in jinqJs wie diese:
Lassen Sie mich wissen, wenn ich kann mehr helfen.
Könnten Sie versuchen, sich zum gruppieren nach Datum.toString(). Kann sicherer sein wegen wie JS wertet Termine der Geschlechter
Alternativ, Menschen kommen in dieser Frage möglicherweise null zu viel buy-in mit linq.js.
Wenn Sie bereits ziehen es in, gehen für Sie, aber wenn dies ist das erste paar echte Anwendungsfälle für Sie, es ist erwähnenswert, dass können Sie das gleiche erreichen in vanilla js:
Für diese Daten:
Können Sie erstellen ein Objekt mit Eigenschaften, die für jede Taste /person und halten Sie aus der Summe der Werte dieser Requisiten
Wenn Sie möchten, dass ein array von Objekten, die Sie umwandeln kann, damit ein Objekt-array wie dieses