我有以下JSON数组:
fruits = [{"fruit":"banana","amount":"2","price":"1"},{"fruit":"apple","amount":"5","price":"2"},{"fruit":"kiwi","amount":"1","price":"5"}]
如何一起计算所有“价格”值?结果应为8。
到目前为止,我有以下问题,但访问价格项目有问题:
function count(fruits) {
var sum = 0;
for (var i = 0; i < fruits.length; i++) {
sum = sum + fruits[i][price];
}
return sum;
}
console.log(count(fruits)
谢谢!
答案 0 :(得分:3)
您需要像以下一样访问它们:
fruits[i].price
然后在添加之前将它们转换为数字:
parseInt(fruits[i].price, 10);
最终代码:
fruits = [{"fruit":"banana","amount":"2","price":"1"},{"fruit":"apple","amount":"5","price":"2"},{"fruit":"kiwi","amount":"1","price":"5"}]
var total = 0;
for(var i=0; i<fruits.length; i++){
total += parseInt(fruits[i].price, 10);
}
alert(total); //8
<强> See the DEMO here 强>
答案 1 :(得分:1)
两件事:
该行
sum = sum + fruits[i][price];
应该是
sum = sum + fruits[i].price;
甚至
sum += fruits[i].price;
您的代码尝试使用名为price
的变量,而不是水果条目的price
属性。
您的价格是字符串,因此我们希望确保在汇总时将它们转换为数字。您有很多选择:向他们应用一元+
,将其传递到Number()
或使用parseInt(..., 10)
。下面我将使用一元+
,但是每个都有优点(没有双关语!)和减少。
var fruits = [{"fruit":"banana","amount":"2","price":"1"},{"fruit":"apple","amount":"5","price":"2"},{"fruit":"kiwi","amount":"1","price":"5"}]
function count(fruits) {
var sum = 0;
for (var i = 0; i < fruits.length; i++) {
sum += +fruits[i].price; // <=== change is here
}
return sum;
}
display(count(fruits));
function display(msg) {
var p = document.createElement('p');
p.innerHTML = String(msg);
document.body.appendChild(p);
}
使用ES5的阵列添加(可以在旧版浏览器上填充),您可以使用forEach
或reduce
执行此操作:
forEach
:
var fruits = [{"fruit":"banana","amount":"2","price":"1"},{"fruit":"apple","amount":"5","price":"2"},{"fruit":"kiwi","amount":"1","price":"5"}]
function count(fruits) {
var sum = 0;
fruits.forEach(function(fruit) {
sum += +fruit.price;
});
return sum;
}
display(count(fruits));
function display(msg) {
var p = document.createElement('p');
p.innerHTML = String(msg);
document.body.appendChild(p);
}
reduce
:
var fruits = [{"fruit":"banana","amount":"2","price":"1"},{"fruit":"apple","amount":"5","price":"2"},{"fruit":"kiwi","amount":"1","price":"5"}]
function count(fruits) {
var sum = 0;
sum = fruits.reduce(function(prev, fruit) {
return prev + +fruit.price;
}, 0);
return sum;
}
display(count(fruits));
function display(msg) {
var p = document.createElement('p');
p.innerHTML = String(msg);
document.body.appendChild(p);
}
答案 2 :(得分:1)
您的代码有2个错误:
访问价格属性
fruits[i][price]
应该是
fruits[i]['price'] or fruits[i].price
price属性是string类型。所以&#39; +&#39;运算符将连接价格字符串。要将它们添加到一起,您需要通过执行
将其类型更改为数字parseInt(fruits[i]['price'], 10) or +fruits[i]['price']
如果price属性不包含有效数字,则结果将为NaN(不是数字)。你可以通过使用or运算符来避免这种情况。
+fruits[i]['price'] || 0
使用所有现代浏览器支持的ES5阵列扩展,您可以编写
fruits.reduce(function(m,v) { return m + (+v.price);}, 0);
在未来的浏览器中使用ES6可以将其缩减为
fruits.reduce((m,v) => m + (+v.price), 0);
答案 3 :(得分:0)
您的代码中存在一些错误。
第一个是:sum = sum + fruits[i][price];
你试图使用一个名为price的变量,而不是对象的属性价格。您可以使用fruits[i]["price"]
或fruits[i].price
访问该媒体资源。
要获得一个数字,当你做总和时,你需要转换数字字符串,为此你可以使用parseInt(fruits[i]["price"]);
。最后一行中的最后一个错误是您忘记了括号和分号。
答案 4 :(得分:0)
你的函数没问题,只需添加parseInt就可以转换为int类型,并且在fruits [i] [price]中的语法不正确。 你有两个选择:
fruits[i]["price"]
OR
fruits[i].price
在我看来,我会添加一个小的逻辑代码来检查它是否是一个数字。如果输入数据未定义或为null,则返回0.
var fruits = [{"fruit":"banana","amount":"2","price":"1"},{"fruit":"apple","amount":"5","price":"2"},{"fruit":"kiwi","amount":"1","price":"5"}]
function count(data) {
var sum = 0;
if(data === void 0 ) return 0; // no array input
data.forEach(function(fruit) {
console.log(fruit);
sum += parseInt(fruit.price || 0 ); // if price is undefined, null or NaN, return 0
})
return sum;
}
display(count(fruits));
function display(msg) {
var p = document.createElement('p');
p.innerHTML = String(msg);
document.body.appendChild(p);
}
答案 5 :(得分:0)
您应该尝试使用这个简单的代码段。
您不需要jQuery来执行此操作。简单的JS就可以了。
var sum = 0;
for(var item in fruits){
sum += ~~(fruits[item].price)
}
console.log(sum)
干杯!