汇总JavaScript数组的对象值?
问题内容:
在JavaScript中,以这种格式输入n个数组作为输入:(n = 2)
array1:
[{x: 1, y: 5},{x: 2, y: 3},{x: 3, y: 6}]
array2:
[{x: 1, y: 2},{x: 2, y: 6},{x: 3, y: 2}]
如何轻松汇总Y值并得到以下结果数组:
arrayOutput:
[{x: 1, y: 7},{x: 2, y: 9},{x: 3, y: 8}]
谢谢。
问题答案:
更新 :有关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
没有该x
值的条目,sum[entry.x]
则将为undefined
,这是一个“假”值。因此,我们使用功能强大的||
运算符x
从sum
或 获取值0
,然后将当前条目添加y
到其中并存储结果。