我有一个像这样的数组y
:
var y = [1, 2, 3, 4];
我想迭代数组,但排除了一些索引。索引保存在第二个数组
中var x = [1,3];
所以,我想写一个数组y
中的每个数字,但不是来自数组x
的位置1,3上的数字
我试图跳过这些位置上的数字,但没有成功。请你帮助我好吗? 这是我试过的
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]);
}
答案 0 :(得分: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 ]
&#13;
答案很长
如果可能,您不想使用循环,因为它可能会损害理解代码的能力,采用过程方法而不是声明性方法。您可以使用higher-order function之类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 ] ]
我们可以看到哪些值为true
。如果我们记住,过滤器会保留true
值[ 1, 3, 5 ]
。
答案 1 :(得分:3)
您可以使用Array.includes()方法。
var list = [1,2,3,4];
var skipIndexes = [1,3];
for (var i = 0; i< list.length; i++) {
if (! skipIndexes.includes(i)) {
console.log(list[i]);
}
}
答案 2 :(得分:2)
看起来你很近,但你不需要内循环。只需检查您所在的索引(i
)是否为数组x
的成员之一,如果是,请继续。您可以使用数组.includes
方法执行此操作,如果您没有es6支持,则可以indexOf
。
var y = [1, 2, 3, 4];
var x = [1,3];
for (var i = 0; i < y.length; i++) {
if (x.includes(i)) continue; // Or if not es6 use: `x.indexOf(i) !== -1`
console.log(y[i]);
}
&#13;
这会打印1
和3
,它们分别是y
和0
nd索引中的数组2
的项目(因为我们跳过了)指数1和3)。