2016-10-03 55 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