是数组js中的元素

时间:2014-02-09 17:56:58

标签: javascript jquery

old question之后,我仍有问题:

a = ["apple", "banana", "orange", "apple"];

a.indexOf("apple") = 0

在数组中找到“apple”元素的BOTH索引的最简单方法是什么?我想立刻删除它们 - 是否可能?

10 个答案:

答案 0 :(得分:15)

这是过滤方法的任务:

var noApples = a.filter(function(el) { return el != "apple"; })

答案 1 :(得分:9)

  

在数组中找到“apple”元素的BOTH索引的最简单方法是什么?

你问过,还问过有关删除的问题。我会首先处理索引,然后删除。

索引:

没有捷径,你必须循环它。您可以使用简单的for循环:

var indexes = [];
var index;

for (index = 0; index < a.length; ++index) {
    if (a[n] === "apple") {
        indexes.push(index);
    }
});

或两个ES5选项:forEach

var indexes = [];
a.forEach(function(entry, index) {
    if (entry === "apple") {
        indexes.push(index);
    }
});

reduce

var indexes = a.reduce(function(acc, entry, index) {
    if (entry === "apple") {
        acc.push(index);
    }
    return acc;
}, []);

......虽然坦率地说这并没有给你带来任何超过forEach的东西。

删除:

问题的结尾:

  

我想立刻删除它们 - 是否可能?

排序。在ES5中,您可以使用filter函数,但它会创建一个 new 数组。

var newa = a.filter(function(entry) {
    return entry !== "apple";
});

这基本上是这样的(在一般术语中):

var newa = [];
var index;

for (index = 0; index < a.length; ++index) {
    if (a[n] !== "apple") {
        newa.push(index);
    }
});

答案 2 :(得分:3)

Array.indexOf接受第二个可选参数:从索引开始。您可以在循环内使用它来指定从最后一个开始。

var indices = [],
    index = 0;

while (true) {
    index = a.indexOf("apple", index);
    if (index < 0) {
        break;
    }
    indices.push(index);
}

一旦indexOf返回-1,表示“找不到元素”,循环就会中断。 然后indices数组将保存正确的索引。

an example on the Mozilla page on indexOf有一些等效的代码。我不是一个粉丝,因为复制增加,但它更短,这很好。

答案 3 :(得分:2)

for loop可以解决问题。或者使用forEach作为T.J.克劳德在他优雅的答案中建议。

我结合了一个如何获取appleIndexes的例子,以及如何通过创建一个除了苹果之外的所有苹果的新数组来从原始数组中“删除”它们。这是使用oldSchool JavaScript:)

a = ["apple", "banana", "orange", "apple"];

appleIndexes = [];
arrayOfNotApples = [];

for (var i = 0; i < a.length; i++)
{
    if (a[i] == "apple")
    {
        appleIndexes.push(i);
    } else {
        arrayOfNotApples.push(a[i]);
    }
}

答案 4 :(得分:2)

如果您需要从数组实例中删除元素而不生成新数组,Array.prototype.splice是一个不错的选择:

var a,
    i;
a = ["apple", "banana", "orange", "apple"];
for (i = a.indexOf('apple'); i > -1; i = a.indexOf('apple')) {
    a.splice(i, 1);
}

如果您可以使用新的数组实例,那么Array.prototype.filter是更好的选择:

var a,
    b;
a = ["apple", "banana", "orange", "apple"];
b = a.filter(function (item, index, array) {
    return item !== 'apple';
});

答案 5 :(得分:1)

使用start中的array.indexOf(element, start)参数,如http://www.w3schools.com/jsref/jsref_indexof_array.asp中所述。

示例:

var a = [1, 3, 4, 1];
var searchElement = 1;
var foundIndices = [];
var startIndex = 0;

while ((index = a.indexOf(searchElement, startIndex)) != -1) {
       foundIndices.push(index);
       startIndex = index + 1;
}
console.log(foundIndices); // Outputs [0, 3];

答案 6 :(得分:1)

一个好的旧while循环:

var i = a.length;
while (i--) {
    if (a[i] === 'apple') {
        a.splice(i, 1); 
    }
}

在函数内部:

function removeAll(value, array) {
    var i = array.length;
    while (i--) {
        if (array[i] === value) {
            array.splice(i, 1); 
        }
    }
    return array;
}

用法:

removeAll('apple', a);

答案 7 :(得分:1)

一些递归解决方案。

的Javascript

function indexesOf(array, searchElement, fromIndex) {
    var result = [],
        index = array.indexOf(searchElement, fromIndex >>> 0);

    if (index === -1) {
        return result;
    }

    return result.concat(index, indexesOf(array, searchElement, index + 1));
}

function removeFrom(array, searchElement, fromIndex) {
    var index = array.indexOf(searchElement, fromIndex >>> 0);

    if (index !== -1) {
        array.splice(index, 1);
        removeFrom(array, searchElement, index);
    }

    return array;
}

var a = [0, 1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6, 0, 7, 0, 8, 0, 9, 0, 10, 0];

console.log(indexesOf(a, 0));
console.log(removeFrom(a, 0));

输出

[0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

jsFiddle

答案 8 :(得分:1)

最快,最兼容的路线是在for循环中向后移动数组。

for (var a = array.length;a--;)
     if (array[a] == 'apple') array.splice(a,1);

答案 9 :(得分:0)

如果要删除所有匹配项,也可以递归使用Array.splice

function remove(list, item) {
    if(list.indexOf(item)<0)
        return list;

    list.splice(list.indexOf(item),1);
    return list;
}