Mise à jour: Le commentaire supplémentaire sur les x
valeurs et leurs positions dans les tableaux ci-dessous rend le hors de propos.
Il n'y a pas de truc particulier, il vous suffit de faire une boucle dans les tableaux et de construire votre résultat. Ce n'est rien de plus qu'une boucle imbriquée. Si vous essayez d'optimiser l'efficacité sur une large gamme de moteurs JavaScript, évitez les appels de fonction inutiles.
Quelque chose le long des lignes de:
function sumYValues(arrays) {
var outer, inner, array, entry, sum, result, x;
// Create our result array with a copy of the first array
result = [];
if (arrays.length > 0) {
array = arrays[0];
for (inner = 0; inner < array.length; ++inner) {
entry = array[inner];
result[inner] = {x: entry.x, y: entry.y};
}
// Add in the remaining values
for (outer = 1; outer < arrays.length; ++outer) {
array = arrays[outer];
// You might want an assert here verifying that result.length == array.length
for (inner = 0; inner < array.length; ++inner) {
entry = array[inner];
// You might want an assert here verifying that result[inner].x == entry.x
result[inner].y += entry.y;
}
}
}
return result;
}
Ces boucles comptent de 0
(ou 1
) à array.length - 1
. Vous pouvez profiler si revenir en arrière (array.length - 1
à 0
(ou 1)) est plus rapide, la plupart du temps le "jusqu'à 0
". J'avais l'habitude de supposer que c'était parce qu'il était en C quand j'étais un jeune visage frais (les comparaisons à 0
sont plus rapides que les comparaisons à une autre variable), mais cette hypothèse peut ou ne peut pas être valide en JavaScript.
Il n'y a pas de raccourci particulier, il vous suffit de faire une boucle dans les tableaux, d'effectuer vos comparaisons et de construire votre résultat. Si les valeurs x
sont uniques dans chaque tableau, il peut être plus facile de suivre votre somme en cours en utilisant un objet plutôt qu'un tableau et en utilisant les valeurs x
comme clés, puis de les convertir en tableau lorsque vous c'est fait. .: par exemple
function sumYValues(arrays) {
var outer, inner, ar, entry, sum, result, x;
sum = {};
for (outer = 0; outer < arrays.length; ++outer) {
ar = arrays[outer];
for (inner = 0; inner < arrays.length; ++inner) {
entry = ar[inner];
sum[entry.x] = (sum[entry.x] || 0) + entry.y;
}
}
result = [];
for (x in sum) {
result.push({x: x, y: sum[x]});
}
return result;
}
Ce qui précède est la plupart du temps juste pour démontrer l'utilisation sum
, un objet, comme une carte de x
=>y
valeurs, même si elle n'implémente au moins une partie de la logique de sommation ainsi.
Cette ligne peut nécessiter quelques explications:
sum[entry.x] = (sum[entry.x] || 0) + entry.y;
Si sum
ne dispose pas d'entrée pour cette valeur x
, sum[entry.x]
sera undefined
, qui est une valeur « Falsey ». Donc, nous utilisons le curiously-powerful ||
operator soit pour obtenir la valeur pour ce x
de sum
ou0
, et ensuite ajouter le y
actuel de l'entrée et de stocker le résultat.
Pouvez-vous nous donner plus d'informations sur les valeurs? Par exemple, dans votre exemple, les entrées de chaque tableau ont des valeurs uniques «x» (par exemple, le même «x» n'apparaît pas dans le même tableau). Est-ce garanti? Est-ce que 'x' est le facteur décisif pour savoir si vous combinez des valeurs' y', ou est-ce la position dans le tableau? Des choses comme ça. –
@ T.J. Crowder: Vous pouvez supposer que tous les tableaux ont la même longueur avec les mêmes valeurs x uniques dans le même ordre. Le nombre de tableaux sera cependant très important, donc une fonction efficace serait très utile. Je vous remercie. – dani
Ah, d'accord, ça change les choses. –