[英]How to sum up all the leaf nodes of a nested Javascript object array?
[英]How to sum up all items in an object array?
我有一個對象數組:
var test = [{"a":1, "b":2, "c":3}, {"a":4, "b":5, "c":6},{"a":7, "b":8, "c":9}];
我想將對象 b 中的所有值相加得到總共 15
像這樣使用reduce
:
var test = [{"a":1, "b":2, "c":3}, {"a":4, "b":5, "c":6},{"a":7, "b":8, "c":9}]; var sum = test.reduce((s, o) => s + ob, 0); console.log(sum);
注意:這個test.reduce((s, o) => s + ob, 0)
使用了一個箭頭函數。 它與以下內容相同:
test.reduce(function(s, o) {
return s + o.b;
}, 0);
從值數組中取回單個值的方法是Array#reduce ,你給它一個累加器函數和一個可選的起始值,並將它應用於每個元素,直到它得到最終值:
var test = [{"a":1, "b":2, "c":3}, {"a":4, "b":5, "c":6},{"a":7, "b":8, "c":9}];
test
.map(function pluckB(o) { return o.b }) // Take only the 'b' property
// => [2,5,8]
.reduce(function add(a, b) { return a + b }, 0); // Sum them, starting from 0
// => 15
它可以通過 ES2015 箭頭函數變得更簡潔:
test.map(o => o.b).reduce((a, b) => a + b, 0)
使用Ramda等函數式實用程序庫,只需調用兩個函數即可:
R.sum(R.pluck('b', test))
正如@ibrahim mahrir 可能想在評論中暗示的那樣,在 JavaScript 中,將這些操作實際組合在一起並且只迭代一次數組而不是使用管道樣式會更高效。 那是因為.map
、 .filter
和 co. 創建新的數組副本而不是就地修改數組,並且實例化是有代價的。
但是除非這段代碼在一個非常緊密的循環中運行,與使用最易讀的解決方案增加的可維護性相比,性能影響絕對可以忽略不計。
如果要查找數組中每個對象的總和,請使用值的總和覆蓋當前元素來迭代數組。
var test = [{"a":1, "b":2, "c":3}, {"a":4, "b":5, "c":6},{"a":7, "b":8, "c":9}]; test.forEach((e, i, a) => a[i] = Object.values(e).reduce((x, y) => x + y, 0)); console.log(test)
如果要查找數組中每個對象的匹配屬性的值的總和,請迭代該數組創建一個新對象並根據鍵添加值。
var test = [{"a":1, "b":2, "c":3}, {"a":4, "b":5, "c":6},{"a":7, "b":8, "c":9}]; var result = test.reduce((o, e) => { for(var i in e) o[i] = (o[i] || 0) + e[i]; return o; }, {}); console.log(result);
您會注意到第二個對象的值等於 15,以及名為“b”的屬性的所有值,因此您在這里並不完全清楚。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.