更新x
:配列内の値とその位置に関する追加のコメントにより、以下は無関係になります。
特にトリックはありません。配列をループして結果を作成するだけです。ネストされたループにすぎません。幅広いJavaScriptエンジンで最大限の効率を発揮しようとしている場合は、不要な関数呼び出しを避けてください。
次のようなもの:
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;
}
これらのループは0
(または1
)から。までカウントされarray.length - 1
ます。逆方向(array.length - 1
から0
(または1))に進む方が速いかどうか、ほとんどの場合「下から0
」の方が速いかどうかをプロファイリングできます。私が新人の頃はCだったからだと思っていましたが(0
他の変数との比較よりも比較が速い)、JavaScriptではその仮定が有効な場合と無効な場合があります。
特にショートカットはありません。配列をループして比較を行い、結果を作成するだけです。
値が各配列で一意である場合は、配列ではなくオブジェクトを使用し、値をキーとして使用し、完了したらそれを配列に変換することでx
、進行中の合計を追跡する方が簡単な場合があります。x
例えば:
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;
}
上記は主にsum
、オブジェクトをx
=>y
値のマップとして使用することを示すためのものですが、合計ロジックの少なくとも一部も実装しています。
この行には説明が必要な場合があります。
sum[entry.x] = (sum[entry.x] || 0) + entry.y;
その値のエントリがsum
ない場合は、「falsey」の値になります。そのため、不思議なことに強力な演算子を使用して、またはからその値を取得し、それに現在のエントリを追加して結果を保存します。x
sum[entry.x]
undefined
||
x
sum
0
y