繁体   English   中英

从JavaScript数组添加和删除值

[英]Adding and Removing Values from JavaScript Array

我有一个JavaScript数字数组。 我的数组是这样定义的:

var customerIds = [];

我有一个函数,负责向此数组中插入和删除ID。 基本上,我的函数如下所示:

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

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

感谢您提供的任何见解。

  1. contains可实现Array.prototype.indexOf ,像这样

     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 ,则跳过删除,否则从position index开始splice 1元素。

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

在可以自由使用“包含”和“删除”之后,可以像下面那样扩展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);
            }
        }
    }

您绝对可以使用@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 ,你会消耗非常大量的内存。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM