Wie über diese (native JS, wird nicht auf älteren Browsern Pause):
function arrayMean(ary) {
var index = {}, i, label, value, result = [[],[]];
for (i = 0; i < ary[0].length; i++) {
label = ary[0][i];
value = ary[1][i];
if (!(label in index)) {
index[label] = {sum: 0, occur: 0};
}
index[label].sum += value;
index[label].occur++;
}
for (i in index) {
if (index.hasOwnProperty(i)) {
result[0].push(parseInt(i, 10));
result[1].push(index[i].occur > 0 ? index[i].sum/index[i].occur : 0);
}
}
return result;
}
FWIW, wenn Sie Lust will es Ich habe ein paar andere Möglichkeiten geschaffen zu tun. Sie hängen von externen Bibliotheken ab und sind sehr wahrscheinlich eine Größenordnung langsamer als eine native Lösung. Aber sie sind netter zu betrachten.
Es könnte wie folgt aussehen, mit underscore.js:
function arrayMeanUnderscore(ary) {
return _.chain(ary[0])
.zip(ary[1])
.groupBy(function (item) { return item[0]; })
.reduce(function(memo, items) {
var values = _.pluck(items, 1),
toSum = function (a, b) { return a + b; };
memo[0].push(items[0][0]);
memo[1].push(_(values).reduce(toSum)/values.length);
return memo;
}, [[], []])
.value();
}
// --------------------------------------------
arrayMeanUnderscore([[3,4,5,3,4,5,2], [12,14,16,11,12,10,20]]);
// -> [[2,3,4,5], [20,11.5,13,13]]
oder wie diese, mit der wirklich großen linq.js (I verwendet v2.2 habe):
function arrayMeanLinq(ary) {
return Enumerable.From(ary[0])
.Zip(ary[1], "[$, $$]")
.GroupBy("$[0]")
.Aggregate([[],[]], function (result, item) {
result[0].push(item.Key());
result[1].push(item.Average("$[1]"));
return result;
});
}
// --------------------------------------------
arrayMeanLinq([[3,4,5,3,4,5,2], [12,14,16,11,12,10,20]]);
// -> [[3,4,5,2], [11.5,13,13,20]]
Wie vermutete, die "Phantasie" Implementierungen sind eine Größenordnung langsamer als eine native Implementierung: jsperf comparison.
Vielen Dank! - Man JS ist nie geradlinig ... – Chrugel
ein paar Verbesserungen: - Ich denke, dass der if test: index.hasOwnProperty (i) ist useless. - Ich denke, parseInt ist nutzlos, da my_array Nummern hat. - Um zu testen, ob der Wert 0 ist, benutze den Satz? stattdessen. ocurr == 0? 0: Summe/auftreten. –
Nur um zu verdeutlichen: Danke euch allen! Ich habe einfach diese Antwort gewählt, b/c gibt mir das richtige/erwartete Ergebnis "out of the box". Mit der (sehr eleganten) Lösung von robertklep & Adrian Maire habe ich Streicher in meinem 'Label'-Subarray, was kein Problem ist, aber Tomalak lieferte eine passende Lösung. – Chrugel