如何从循环中排除索引数组

Ann*_*a F 1 javascript arrays

我有这样一个数组y:

var y = [1, 2, 3, 4];
Run Code Online (Sandbox Code Playgroud)

我想迭代数组,但排除一些索引.索引保存在第二个数组中

var x = [1,3];
Run Code Online (Sandbox Code Playgroud)

所以,我想写一个数组中的每个数字y,但不是来自数组的位置1,3上的数字x

我试图跳过这些位置上的数字,但没有成功.请你帮助我好吗?这是我试过的

for (var i = 0; i < y.length; i++) {
    for (var j = 0; j < x.length; j++) {
            if (i === x[j]) {
        continue;
     } 
    }
 console.log(y[i]);
}
Run Code Online (Sandbox Code Playgroud)

toa*_*tal 5

简短的回答

更喜欢使用filter循环

const xs = [ 1, 2, 3, 4, 5 ]  // array of values
const ys = [ 1, 3 ]           // indices to skip

// using `filter`
const zs = xs.filter((_, i) => !ys.includes(i))

console.log(zs)
//=> [ 1, 3, 5 ]
Run Code Online (Sandbox Code Playgroud)

答案很长

如果可能,您不希望使用循环,因为它可能会损害理解代码的能力,采用过程方法而非声明方法.您可以改用高阶函数一样Array.prototype.filter,让你想要的值.传入函数的返回值filter需要返回保留内容的布尔值.在JavaScript中,filter函数是二元arity,意味着它接受两个参数,第一个参数是数组元素,第二个参数是索引.我们可以忽略数组元素值,因为它只是我们需要检查的索引(这就是函数(_, ...)以删除第一个参数开始的原因).

Array.prototype.includes是数组原型上的一个函数,它可以让您知道数组是否包含值(即[0].includes(0) === true[0].includes(1) == false).

将这两个概念放在一起,我们可以迭代第一个数组,xs忽略值,但使用索引来查看它是否包含在我们列入黑名单的索引数组中ys.

如果我们将其视为一个map函数,而不是filter包含我们的值

xs.map((v, i) => [ v, !ys.includes(i) ])
//=> [ [ 1, true ], [ 2, false ], [ 3, true ], [ 4, false ], [ 5, true ] ]
Run Code Online (Sandbox Code Playgroud)

我们可以看到哪些值true.如果我们记得,过滤器会保留我们的true价值观[ 1, 3, 5 ].