如何在javascript中添加json数组中的所有price元素

时间:2014-09-29 07:10:56

标签: javascript jquery arrays json

我有以下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)

谢谢!

6 个答案:

答案 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)

两件事:

  1. 该行

    sum = sum + fruits[i][price];
    

    应该是

    sum = sum + fruits[i].price;
    

    甚至

    sum += fruits[i].price;
    

    您的代码尝试使用名为price变量,而不是水果条目的price属性。

  2. 您的价格是字符串,因此我们希望确保在汇总时将它们转换为数字。您有很多选择:向他们应用一元+,将其传递到Number()或使用parseInt(..., 10)。下面我将使用一元+,但是每个都有优点(没有双关语!)和减少。

  3. 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的阵列添加(可以在旧版浏览器上填充),您可以使用forEachreduce执行此操作:

    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"]);。最后一行中的最后一个错误是您忘记了括号和分号。

JSFiddle

答案 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)

干杯!