我有一个JavaScript数组。我的数组定义如下:
var customerIds = [];
我有一个函数负责在这个数组中插入和删除id。基本上,我的功能看起来像这样:
function addOrRemove(shouldAdd, customerId) {
if (shouldAdd) {
if (customerIds.contains(customerId) === false) {
customerIds.push(customerId);
}
} else {
customerIds.remove(customerId);
}
}
这个功能基本上是伪代码。 JavaScript数组没有包含或删除功能。我的问题是,有没有优雅的方法来解决这个问题?我能想到的最好的就是自己循环遍历数组并跟踪找到的第一个项目的索引。
感谢您提供的任何见解。
答案 0 :(得分:1)
使用Array.prototype.indexOf
可以实现contains
,就像这样
if (customerIds.indexOf(customerId) === -1) {
indexOf
函数返回-1
,如果它无法在数组中找到参数,否则返回匹配的第一个索引。因此,如果结果为-1
,则表示customerIds
不包含 customerId
。
使用Array.prototype.indexOf
和Array.prototype.splice
可以实现remove
,就像这样
var index = customerIds.indexOf(customerId);
if (index !== -1) {
customerIds.splice(index, 1);
}
类似地,indexOf
函数返回-1
,如果它无法在数组中找到参数,否则返回匹配的第一个索引。因此,如果结果为-1
,我们会跳过删除,否则splice
1
元素从位置index
开始。
答案 1 :(得分:0)
使用indexOf
和splice
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所述的splice
和indexOf
,但我想提供另一种方法。
您可以使用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
,则会消耗大量内存。