【问题标题】:Adding a new element or updating an existing element in an array添加新元素或更新数组中的现有元素
【发布时间】:2014-12-03 08:22:06
【问题描述】:

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

例如, { 物品:'牛奶',成本: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});
}

【问题讨论】:

  • 只有当你的循环完全结束时,你才知道该项目是否存在。
  • push 将向数组添加一个项目。看看这个帖子stackoverflow.com/questions/4689856/…
  • 你的代码看起来不错,有什么问题?
  • @BramDriesen 我认为 OP 明白这一点。这是在哪里提出问题(以及使用什么条件逻辑)。

标签: javascript arrays for-loop


【解决方案1】:

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
    });
} 

【讨论】:

  • 行不通。您正在推动每一次迭代都不是匹配的。
【解决方案2】:

您可以使用 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: 'Milk', cost: 1.99, 数量: 2 }, { item: 'Bread', cost: 1, quantity: 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;
  };
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-26
    • 2018-12-11
    • 2021-01-31
    • 1970-01-01
    • 1970-01-01
    • 2018-08-11
    • 2017-11-30
    • 1970-01-01
    相关资源
    最近更新 更多