使用.foreach从另一个

时间:2015-09-15 04:44:36

标签: javascript arrays loops foreach

我试图使用.forEach从另一个数组(输入)中删除一个数组(忽略)的内容。

作为下面的一个例子,我希望输入数组包含" b"和" h"但它含有" g"和" h"当我跑这个。

好奇为什么我没有得到我预期的结果,如果这是一个好方法。

var input = ["a", "b", "g", "h"],                                               
    ignore = ["b", "h"];                                                        

var newInput = function(element, index, array){                                 
    if (input.indexOf(ignore[index]) > -1){                                     
       input.splice((ignore[index]), 1)                                        
    }                                                                           
}                                                                               

  ignore.forEach(newInput);

4 个答案:

答案 0 :(得分:1)

将您的条件替换为input.indexOf(element) > -1

由于您要使用忽略数组,因此ignore[index]element相同。

将拼接更改为splice(input.indexOf(element), 1)

Array.splice()将索引作为第一个参数,而您正在使用该元素。

答案 1 :(得分:1)

var input = ["a", "b", "g", "h"],
    ignore = ["b", "h"];                        

var newInput = function(element, index, array){
    if (input.indexOf(ignore[index]) > -1) {
       input.splice(input.indexOf(ignore[index]), 1)
//                  ^^^^^^^^^^^^^  added this
    }
} 

ignore.forEach(newInput);

但该代码可能更清晰,例如ignore[index]element

var input = ["a", "b", "g", "h"],
    ignore = ["b", "h"];

var newInput = function(element) {
    var index = input.indexOf(element);
    if (index > -1){
       input.splice(index, 1)
    }
}

ignore.forEach(newInput);

如果你真的想给女孩留下深刻印象

var input = ["a", "b", "g", "h"],
    ignore = ["b", "h"];

var newInput = function(element, index) {
    ~(index = input.indexOf(element)) && input.splice(index, 1);
}

ignore.forEach(newInput);

我会告诉你一个班轮:p

  

mutliple deletions

var newInput = function(element) {
    var index;
    while (~(index = input.indexOf(element)))
        input.splice(index, 1);
}

ignore.forEach(newInput);

答案 2 :(得分:1)

您应该使用Array.prototype.filter代替

var input = ['a', 'b', 'g', 'h']
var ignore = ['b', 'h']
var newInput = input.filter(function (el) {
  return ignore.indexOf(el) === -1
})

请注意input保持不变

答案 3 :(得分:1)

Array#filter可能是最好的方法,但是如果你想要删除被忽略的元素,就像我使用splice推断的那样,你可以这样做:

function ignore_elements(input, ignore) {
  var i = 0;
  while (i < input.length)
    if (ignore.indexOf(input[i]) !== -1) input.splice(i, 1);
    else i++;
}

通过循环输入中的元素而不是ignore,您可以更轻松地消除要忽略的元素的所有出现,而不仅仅是第一个。