2016-10-03 53 views
0

我需要在數組中總結一些對象值。有的可以int,而有的可能string即:數組對象上的字符串值的總和

的JavaScript:

let array = [ 
{quantity: 1, amount: "24.99"} 
{quantity: 5, amount: "4.99"}, 
] 

四處堆棧溢出我發現this method(IM使用反應):

Array.prototype.sum = function (prop) { 
    var total = 0 
    for (var i = 0, _len = this.length; i < _len; i++) { 
     total += this[i][prop] 
    } 
    return total 
}; 

let totalQuantity = array.sum("quantity"); 
console.log(totalQuantity); 

雖然該作品很好,我需要爲字符串amount做同樣的事情。由於我需要將amount轉換爲浮點數,因此上述操作無效。反應過來抱怨Component's children should not be mutated.

不被JS忍者,我認爲這會做一些法寶:

Array.prototype.sum = function (prop) { 
    var newProp = parseFloat(prop); 
    var total = 0 
    for (var i = 0, _len = this.length; i < _len; i++) { 
     total += this[i][newProp] // Surely this is wrong :(
    } 
    return total 
}; 

任何清潔的方式來實現這一目標?

我需要這樣的:

let totalAmount = array.sum("amount"); 

回答

3

定義一個通用的sum功能,這是因爲

let sum = a => a.reduce((x, y) => x + y); 

微不足道並將其應用到的值的列表從源陣列拾取:

let array = [ 
 
{quantity: 1, amount: "24.99"}, 
 
{quantity: 5, amount: "4.99"} 
 
]; 
 
    
 
let sum = a => a.reduce((x, y) => x + y); 
 
    
 
let totalAmount = sum(array.map(x => Number(x.amount))); 
 
    
 
console.log(totalAmount.toFixed(2)) 
 
    
 

+0

好抓。我想知道是否有另一種方式,而不是使用'Array.prototype' – Sylar

2

請嘗試:

Array.prototype.sum = function (prop) { 
    var total = 0 
    for (var i = 0, _len = this.length; i < _len; i++) { 
     total += parseFloat(this[i][prop]) // Surely this will work :) 
    } 
    return total 
}; 
+0

啊啊!感謝那。有另一隻眼睛來看待事情是很好的。 – Sylar

+1

@Sylar看看array.reduce版本;) –

0

const array = [ 
 
{quantity: 1, amount: "24.99"}, 
 
{quantity: 5, amount: "4.99"} 
 
] 
 
    
 
Array.prototype.sum = function(key) { 
 
    return this.reduce(function(total, item) { 
 
    return total + parseFloat(item[key]); 
 
    }, 0); 
 
} 
 

 
// weird javascript math ... 
 
console.log(array.sum("amount")); 
 

 
// workaround 
 
console.log(array.sum("amount").toFixed(2));

這項工作很好;)

0

我通常使用的reduce()方法針對這些情況。這裏是一個小演示:http://codepen.io/PiotrBerebecki/pen/zKEQgL

let array = [ 
{quantity: 1, amount: "24.99"}, 
{quantity: 5, amount: "4.99"} 
] 

function sumProperty(arr, type) { 
    return arr.reduce((total, obj) => { 
    if (typeof obj[type] === 'string') { 
     return total + Number(obj[type]); 
    } 
    return total + obj[type]; 
    }, 0); 
} 

let totalAmount = (sumProperty(array, 'amount')).toFixed(2); 
console.log( totalAmount ); // 29.98 

let totalQuantity = sumProperty(array, 'quantity'); 
console.log( totalQuantity ); // 6