用Javascript从数组中指定值删除一个元素

10

我已经阅读了这个问题:

JavaScript中删除数组元素 - delete vs splice

似乎splice和delete都需要元素的索引才能删除,那么当我有元素的值时如何轻松地找到索引呢?

例如,如果我有一个看起来像这样的数组:

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

我想要移除test2。目前我使用的方法是使用$.each检查数组中每个元素的值,通过该过程保持一个计数器(用作索引引用),如果值等于"test2",那么我就有了我的索引(以计数器形式)并使用splice将其移除。

随着数组增长,我想这将是一个缓慢的过程,但我有哪些替代选项呢?


1
看看 indexOf 就是你想要的。 - josh.trow
5个回答

4
你想使用splice()函数来删除元素,indexOf会在数组中找到它: 查找数组中特定元素:知道要删除哪个
var index = array.indexOf('test2'); 

完整示例:

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

工作演示


他知道这个 - 他甚至在问题中说他正在使用它。他想知道的是如何找到要在splice中使用的索引。 - josh.trow

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

indexOf来源):
返回指定元素在数组中第一次出现的位置的索引,如果不存在则返回 -1。


2
你可以使用 jQuery 的 $.inArray 方法来替代你的 $.each 循环,它可以跨浏览器工作(不像 Array.indexOf):
var index = $.inArray("test2", ["test1", "test2", "test3"]); // 1

我知道你的问题没有标记为“jQuery”,但你提到你已经在使用一个$.each循环。

1

您可以使用 Array#indexOf 方法按值查找元素,然后使用返回的索引。请注意,旧版浏览器可能没有该方法,因此您需要检查是否存在,如果不存在,则添加它——这里是来自 MDC 的一些代码 代码在这里,该代码对其进行检查并在不存在时添加该函数。

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”,有关详细信息,请参见此博客文章

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接