在JavaScript数组中添加和删除值

时间:2014-10-22 18:16:55

标签: javascript arrays

我有一个JavaScript数组。我的数组定义如下:

var customerIds = [];

我有一个函数负责在这个数组中插入和删除id。基本上,我的功能看起来像这样:

function addOrRemove(shouldAdd, customerId) {
  if (shouldAdd) {
    if (customerIds.contains(customerId) === false) {
      customerIds.push(customerId);
    }
  } else {
    customerIds.remove(customerId);
  }
}

这个功能基本上是伪代码。 JavaScript数组没有包含或删除功能。我的问题是,有没有优雅的方法来解决这个问题?我能想到的最好的就是自己循环遍历数组并跟踪找到的第一个项目的索引。

感谢您提供的任何见解。

4 个答案:

答案 0 :(得分:1)

  1. 使用Array.prototype.indexOf可以实现contains,就像这样

    if (customerIds.indexOf(customerId) === -1) {
    

    indexOf函数返回-1,如果它无法在数组中找到参数,否则返回匹配的第一个索引。因此,如果结果为-1,则表示customerIds 不包含 customerId

  2. 使用Array.prototype.indexOfArray.prototype.splice可以实现remove,就像这样

    var index = customerIds.indexOf(customerId);
    if (index !== -1) {
        customerIds.splice(index, 1);
    }
    

    类似地,indexOf函数返回-1,如果它无法在数组中找到参数,否则返回匹配的第一个索引。因此,如果结果为-1,我们会跳过删除,否则splice 1元素从位置index开始。

答案 1 :(得分:0)

使用indexOfsplice

function addOrRemove(shouldAdd, customerId) {
    if (shouldAdd) {
        if (customerIds.indexOf(customerId) == -1) {
            customerIds.push(customerId);
        }
    } else {
        var index = customerIds.indexOf(customerId)
        customerIds.splice(index, 1);
    }
}

答案 2 :(得分:0)

您可以自由使用'contains'和'remove'

扩展Array方法,如下所示
if (!Array.contains)
    Array.prototype.contains = function(a) {
        for (var i in this) {
            if (this[i] == a) return true;
        }
        return false
    }
if (!Array.remove)
    Array.prototype.remove = function(a) {
        for (var i in this) {
            if (this[i] == a) {
                this.splice(i, 1);
            }
        }
    }

答案 3 :(得分:0)

您绝对可以使用@thefourtheye所述的spliceindexOf,但我想提供另一种方法。

您可以使用array

,而不是使用object
var customerIds = {};
//This could also be stated as: var customerIds = new Object(); this is just shorthand

function addOrRemove(shouldAdd, customerId)
{
    if(shouldAd)
    {
        if(!customerIds[customerId])
        {
            customerIds[customerId] = new Object();
            customerIds[customerId].enabled = true;
        }
    }
    else
    {
        if(customerIds[customerId])
        {
            customerIds[customerId].enabled = false;
        }
    }
}

您现在可以针对特定customerIds

查询customerId对象
if(customerIds[customerId].enabled)

使用此方法不仅可以为您提供将多个属性附加到给定customerId的功能,还可以在禁用(删除)后保留所有customerIds的记录。

不幸的是,为了真正删除customerId,您需要遍历该对象并将该对象的每个属性追加到一个新对象,除了您不想要的对象。该功能如下所示:

function removeId(customerId)
{
    var n_customerIds = new Object();

    for(var key in customerIds)
    {
        if(key != customerId)
        {
            n_customerIds[key] = customerIds[key];
        }
    }

    customerIds = n_customerIds;
}

我绝不会说这将是您实施的正确方法,但我只是提供了另一种实现目标的方法。有许多等效的方法可以解决您的困境,而且完全由您决定哪种方法最适合您的项目功能。我亲自在许多项目中使用过这种方法,并且我在其他许多项目中使用过其他人发布的方法。每种方法都有其优点和缺点。

如果你确实希望使用这种方法,我建议你这样做,如果你没有收集很多customerIds,并且每个customerData都需要很多customerId,或者,如果你收集了很多customerIds而且每个customerData都不需要很多customerId。如果您为很多customerData存储了大量customerIds,则会消耗大量内存。