更新:关于阵列中的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
值在每个数组中都是唯一的,则可以更容易地使用对象而不是数组来跟踪您正在进行的总和,并将其作为关键字使用,然后将它转换为数组'重做。例如为:
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
没有为x
值的条目,sum[entry.x]
将undefined
,这是一个“falsey”值。因此,我们使用curiously-powerful ||
operator或者从sum
或0
获取x
的值,然后将当前条目的y
添加到它并存储结果。
你能给我们提供更多关于价值的信息吗?例如,在你的例子中,每个数组的条目都有唯一的“x”值(例如,同一个'x'不出现在同一个数组中)。这有保证吗? “x”是决定是否合并“y”值的决定因素,还是数组中的位置?像这样的东西。 – 2011-06-17 08:33:30
@ T.J。 Crowder:你可以假设所有的数组具有相同的长度,并且具有相同的唯一x值。数组的个数将会非常大,所以一个有效的函数将非常有用。谢谢。 – dani 2011-06-17 08:36:52
啊,好吧,那改变了事情。 – 2011-06-17 08:41:45