从数组中删除元素,在Javascript中指定值

Removing an element from an array specifying a value in Javascript

我读过这个问题:

在javascript中删除数组元素-删除与拼接

似乎拼接和删除都需要元素的索引才能删除,所以当我有值时,如何轻松找到索引?

例如,如果我有一个这样的数组:

1
["test1","test2","test3"]

我想删除test2。我现在使用的进程,我希望不是正确的方法,它使用$.each检查数组中每个元素的值,通过进程维护一个计数器(用作索引引用),如果值等于"test2",那么我就有了索引(以计数器的形式),然后使用拼接来删除它。

当数组变大时,我会认为这是一个缓慢的过程,但是我有什么选择呢?


要使用splice()函数删除该项,indexof将在数组中找到它:

在数组中查找特定元素:(知道要删除哪个元素)

1
var index = array.indexOf('test2');

完整例子:

1
2
3
var array = ['test1', 'test2', 'test3'];
var value_to_remove = 'test2';
array.splice(array.indexOf(value_to_remove), 1);

工作演示


1
2
var array = ["test1","test2","test3"];
array.splice(array.indexOf("test2"), 1);

indexOf(来源):
返回在数组中可以找到给定元素的第一个索引,如果不存在,则返回-1。


您可以jquery的$.inArray并摆脱$.each循环,它可以跨浏览器工作(与array.indexof不同):

1
var index = $.inArray("test2", ["test1","test2","test3"]); // 1

(我知道你的问题没有被标记为"jquery",但是你提到你已经在使用一个$.each循环)。


使用Array#indexOf按值查找元素,然后使用结果索引。请注意,旧版本的浏览器可能没有它,因此您需要检查它是否存在,如果不存在,请添加它。下面是MDC中的一些代码,用于进行检查,如果不存在,则添加函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
if (!Array.prototype.indexOf) {
    Array.prototype.indexOf = function (searchElement /*, fromIndex */ ) {
       "use strict";
        if (this === void 0 || this === null) {
            throw new TypeError();
        }
        var t = Object(this);
        var len = t.length >>> 0;
        if (len === 0) {
            return -1;
        }
        var n = 0;
        if (arguments.length > 0) {
            n = Number(arguments[1]);
            if (n !== n) { // shortcut for verifying if it's NaN
                n = 0;
            } else if (n !== 0 && n !== (1 / 0) && n !== -(1 / 0)) {
                n = (n > 0 || -1) * Math.floor(Math.abs(n));
            }
        }
        if (n >= len) {
            return -1;
        }
        var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0);
        for (; k < len; k++) {
            if (k in t && t[k] === searchElement) {
                return k;
            }
        }
        return -1;
    }
}

请注意,如果向Array原型添加这样的内容,那么假定它们只看到数组索引(即,不正确但常见的for..in循环)的for..in循环)将开始出现问题,因为它们只希望看到数组索引时会看到字符串"indexof",有关详细信息,请参阅本文。


js是一个非常棒的小库,有很多好的实用功能。在这种情况下,拒绝是合适的。

http://documentcloud.github.com/underline/拒绝

(尽管内部方法当然类似于手动索引查找和切片/拼接)。