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

时间:2011-08-10 17:57:48

标签: javascript arrays

我读过这个问题:

Deleting array elements in JavaScript - delete vs splice

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

例如,如果我有一个如下所示的数组:

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

我想删除test2。我现在正在使用的进程,我希望这不是正确的方法,使用$.each检查数组中每个元素的值,在整个过程中维护一个计数器(用作索引引用)如果值等于“test2”,那么我有我的索引(以计数器的形式),然后使用splice将其删除。

当阵列变大时,我会想象这将是一个缓慢的过程,但我有什么替代方案?

5 个答案:

答案 0 :(得分: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); 

<强> Working Demo

答案 1 :(得分:3)

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

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

答案 2 :(得分:2)

你可以jQuery的$.inArray并摆脱你的$.each循环,它可以跨浏览器工作(与Array.indexOf不同):

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

(我意识到你的问题没有用“jQuery”标记,但你确实提到你已经在使用$.each循环了。)

答案 3 :(得分:1)

使用Array#indexOf按值找到元素,然后使用生成的索引。请注意,较旧的浏览器可能没有它,因此您需要检查它是否在那里,如果没有添加它 - 来自MDC的here's some code进行检查并添加函数(如果它不存在)。

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循环会假设它们只会看到数组索引(即incorrect但常见for..in } loops)将开始出现问题,因为当他们只希望看到数组索引时,他们会看到字符串“indexOf”,有关详细信息,请参阅this blog post

答案 4 :(得分:0)

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

http://documentcloud.github.com/underscore/#reject

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