2014-10-08 405 views
2

我有一個包含用戶選擇放入其中的項目的帳單數組。添加新元素或更新數組中的現有元素

例如, {項目:「奶」,費用:1.99,數量:1}

我想什麼做的是更新量爲2如果另一個牛奶被添加到籃下,而不是添加其他牛奶項目。這是什麼樣的代碼,我目前所面對的:

for (var i = 0; i < bill.length; i++) { 
    if (newItem == bill[i].item) { 
     bill[i].quantity++; 
    } 

    //IF IT CANNOT BE FOUND ADD NEW ITEM 
    bill.push({ 
     item: newItem, 
     cost: cost, 
     quantity: 1}); 
} 
+1

當您的循環完成後,您只需知道物品是否存在。 – ajp15243 2014-10-08 15:38:51

+0

'push'會將一個項目添加到數組中。看看這個帖子http://stackoverflow.com/questions/4689856/how-to-change-value-of-object-which-is-inside-an-array-using-javascript-or-jquer – Bram 2014-10-08 15:40:04

+0

你的代碼看起來不錯, 問題是什麼? – 2014-10-08 15:40:44

回答

2

break退出循環,並設置一個標誌,如果它發現:

var found = false; 
for(var i = 0; i < bill.length; i++){ 
    if(newItem == bill[i].item){ 
     bill[i].quantity++; 
     found = true; 
     break; 
    } 
} 

if (!found) { 
    bill.push({ 
     item: newItem, 
     cost: cost, 
     quantity: 1 
    }); 
} 
+3

不起作用。你推動每一次迭代,這不匹配。 – mpen 2014-10-08 15:39:35

+0

@Mark - 正在編輯:D – tymeJV 2014-10-08 15:40:00

0

可以使用的ECMAScript 6和諧陣列方法findIndex()

function addItem(newItem, cost, quantity) { 
    var index = bill.findIndex(function(element) { 
     return element.item === newItem; 
    }); 
    if (index >= 0) { 
     bill[index].quantity += quantity; 
    } else { 
     bill.push({item: newItem, cost: cost, quantity: quantity}); 
    } 
} 

它將返回,如果沒有這樣的元素被發現的謂詞,或者-1匹配的數組的元素的索引。例如,下列代碼:

var bill = [{ item: 'Milk', cost: 1.99, quantity: 1 }]; 
addItem('Milk', 1.99, 1); 
addItem('Bread', 1.00, 1); 
console.log(bill); 

產生輸出:

[{項目: '牛奶',成本:1.99,數量:2}, {項目: '麪包',成本:1,數量:1}]

findIndex()方法不是很廣泛支持的是,但有一個findIndex() polyfill

if (!Array.prototype.findIndex) { 
    Array.prototype.findIndex = function(predicate) { 
    if (this == null) { 
     throw new TypeError('Array.prototype.find called on null or undefined'); 
    } 
    if (typeof predicate !== 'function') { 
     throw new TypeError('predicate must be a function'); 
    } 
    var list = Object(this); 
    var length = list.length >>> 0; 
    var thisArg = arguments[1]; 
    var value; 

    for (var i = 0; i < length; i++) { 
     value = list[i]; 
     if (predicate.call(thisArg, value, i, list)) { 
     return i; 
     } 
    } 
    return -1; 
    }; 
}