2014-09-29 56 views
1

均價元素我有以下的JSON數組:我該怎麼做加法從JSON數組在javascript

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

也就是說對象常量數組。沒有[JSON數組]這樣的東西(http://benalman.com/news/2010/03/theres-no-such-thing-as-a-json/)。 (該文章是專門針對對象,但同樣適用於數組)。 – 2014-09-29 11:02:03

回答

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

+0

謝謝阿卜杜勒,那完美的作品! – domi771 2014-09-29 09:52:51

+0

不客氣.. – 2014-09-29 09:53:18

+0

[始終使用基數](http://www.michaelgaigg.com/blog/2008/10/07/the-importance-of-the-javascript-parseint-radix/)使用時'parseInt'! – 2014-09-29 11:05:27

1

兩件事情:

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

    應該

    sum = sum + fruits[i].price; 
    

    甚至

    sum += fruits[i].price; 
    

    您的代碼嘗試使用變量,調用price,而不是水果條目的price屬性。

  2. 你的價格是字符串,所以我們要確保它們在總結時轉換爲數字。你有很多選擇:向他們申請一個+,將他們傳遞到​​,或使用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的數組添加(它可以在舊的瀏覽器被墊高),您可與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); 
 
}

0

您在代碼中有一些錯誤。 第一個是這裏:sum = sum + fruits[i][price]; 您正在嘗試使用名爲price的變量,而不是對象的屬性價格。您可以使用fruits[i]["price"]fruits[i].price訪問酒店。 要獲得一個數字,當你正在做數字時,你需要將數字轉換成字符串,這樣做你可以使用parseInt(fruits[i]["price"]);。最後一行中的最後一個錯誤是您忘記了括號和分號。

JSFiddle

0

你的函數是確定的,只是加parseInt函數爲它轉換成int類型,並在水果不正確的語法[I] [價格]。 您將兩個選項:

fruits[i]["price"] 
OR 
fruits[i].price 

在我看來,我想補充一個小邏輯代碼來檢查它是否是一個數字或沒有。如果輸入數據未定義或爲空,則返回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); 
} 
0

你應該試試這個簡單的代碼片段。

你不需要jQuery來做這個操作。簡單的JS會做。

var sum = 0; 
for(var item in fruits){ 
    sum += ~~(fruits[item].price) 
} 
console.log(sum) 

乾杯!

1

你的代碼中有2個錯誤:

要訪問價格財產

fruits[i][price] 

應該

fruits[i]['price'] or fruits[i].price 

價格屬性是字符串類型。所以'+'操作符將連接價格字符串。要添加在一起,你需要做

parseInt(fruits[i]['price'], 10) or +fruits[i]['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);