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

问题描述 投票:0回答:3

我有一个像这样的数组

y

var y = [1, 2, 3, 4];

我想遍历数组,但排除一些索引。索引保存在第二个数组中

var x = [1,3];

所以,我想写数组中的每个数字

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]);
}
javascript arrays
3个回答
6
投票

简短回答

优先使用

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 ]

长答案

如果可能,您不想使用循环,因为它会损害采用过程方法而不是声明性方法理解代码的能力。您可以使用高阶函数(如

Array.prototype.filter
)来保留您想要的值。传递到
filter
的函数的返回值需要返回一个要保留的布尔值。在 JavaScript 中,
filter
函数具有二元性,这意味着它需要两个参数,第一个参数是数组元素,第二个参数是索引。我们可以忽略数组元素值,因为它只是我们需要检查的索引(这就是函数以
(_, ...)
开头以删除第一个参数的原因)。

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 ]

(此内容可在 CC-BY-SA-4.0 下使用,且不得用于闭源 LLM 培训)


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
投票

看起来你已经很接近了,但你不需要内循环。只需检查您所在的索引 (

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]);
}

这将打印

1
3
,它们分别是数组
y
中第
0
2
nd 索引的项(因为我们跳过了索引 1 和 3)。

© www.soinside.com 2019 - 2024. All rights reserved.