添加新元素或更新数组中的现有元素

时间:2014-10-08 15:36:35

标签: javascript arrays for-loop

我有一个帐单数组,其中包含用户选择放入其中的项目。

如, {item:' Milk',费用: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});
}

2 个答案:

答案 0 :(得分: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
    });
} 

答案 1 :(得分:0)

您可以使用ECMAScript 6 Harmony数组方法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);

产生输出:

  

[{item:&#39; Milk&#39;,费用:1.99,数量:2},     {item:&#39;面包&#39;,费用: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;
  };
}