2015-10-22 60 views
0

我有一個從Web服務返回的JSON對象,它是一個對象數組。我需要將「數據」數組一起添加到一個求和數組中。 JSON響應看起來像這樣:Javascript:通過密鑰求和多個數組的最高效方式

[ 
    { 
    "data":[ 
     0,3,8,2,5 
    ], 
    "someKey":"someValue" 
    }, 
    { 
    "data":[ 
     3,13,1,0,5 
    ], 
    "someKey":"someOtherValue" 
    } 
] 

有可能是在陣列中的對象的氮量。對於上面的例子中所需的輸出將是:

[3, 16, 9, 2, 10] 

我打算上創建一個空的數組變量(VAR ARR),然後遍歷對象,並且對於每個對象,通過「數據」循環密鑰和爲每個鍵增加arr中對應的鍵值。

是否有更有效的方式使用某種合併功能來做到這一點?

+0

是否'data'陣列具有總是相同的長度? – hsz

+0

是的每個對象都是一樣的長度 – ExoticChimp

回答

1

如果每個對象都具有相同的data長度,你可以嘗試使用:

var input; // Your input data 
var output = []; 
for (var i = 0; i < input[0].data.length; i++) { 
    output[i] = input.reduce(function(prev, item) { 
    return +(item.data[i]) + prev; 
    }, 0); 
} 

console.log(output); 
// [3, 16, 9, 2, 10] 

如果每個對象都有不同的data大小:

var input; // Your input data 
var i = 0, output = []; 
while (true) { 
    var outOfIndex = true; 

    var sum = input.reduce(function(prev, item) { 
    if (item.data[i] !== undefined) { 
     outOfIndex = false; 
    } 
    return +(item.data[i]) + prev; 
    }, 0); 

    if (outOfIndex) { 
    break; 
    } 
    output[i++] = sum; 
} 

console.log(output); 
// [3, 16, 9, 2, 10] 
+0

啊對不起,我在評論中誤解了你的問題。 「數據」並不總是5,它可以是任意長度,但對於每個對象來說,它總是相同的長度(如果這是明確的:)) – ExoticChimp

+0

@ExoticChimp固定長度。 – hsz

+1

使用「input [0] .data.length」更改硬編碼「5」應該做到這一點(假設每個數據集中總是會有1+條記錄......如果有空數據集可用,請首先檢查)。 不過,我建議你實現你對你的問題,以及與此相反的建議提出了它的直接的解決方案;除非執行時間有顯着差異,否則我會傾向於使用循環,因爲一眼就可以更容易地進行維護和理解。 –

0

略少於必要的解決方案:

//zip takes two arrays and combines them per the fn argument 
function zip(left, right, fn) { 
    var shorter = (right.length > left.length) ? left : right; 
    return shorter.map(function(value, i) { 
     return fn(left[i], right[i]); 
    }); 
} 

//assuming arr is your array of objects. Because were using 
//zip, map, and reduce, it doesn't matter if the length of the 
//data array changes 
var sums = arr 
    .map(function(obj) { return obj.data; }) 
    .reduce(function(accum, array) { 

     //here we want to combine the running totals w/the current data 
     return zip(accum, array, function(l, r) { return l + r; }); 
    }); 
2

這個怎麼樣,我相信它應該適用於所有cas ES。

var data = [{ 
 
    "data": [ 
 
    0, 3, 8, 2, 5 
 
    ], 
 
    "someKey": "someValue" 
 
}, { 
 
    "data": [ 
 
    3, 13, 1, 0, 5 
 
    ], 
 
    "someKey": "someOtherValue" 
 
}]; 
 

 
var datas = data.reduce(function(a, b) { 
 
    b.data.forEach(function(x, i) { 
 
    a[i] = a[i] || 0; 
 
    a[i] += x; 
 
    }); 
 
    return a; 
 
}, []); 
 

 
console.log(datas);

+0

這似乎也行得通。我想知道這是否比接受的答案更有效率?我的猜測是差異將是可以忽略的 – ExoticChimp

相關問題