检查数组中是不是存在迭代器时,array.includes 不起作用[重复]

Posted

技术标签:

【中文标题】检查数组中是不是存在迭代器时,array.includes 不起作用[重复]【英文标题】:array.includes doesn't work when checking if an iterator exists in array [duplicate]检查数组中是否存在迭代器时,array.includes 不起作用[重复] 【发布时间】:2021-12-18 07:23:59 【问题描述】:

我在我的 javascript 代码中遇到了一些我想了解的意外行为。我想要一个单行函数来检测整数数组中是否存在数字。被检查的数字是另一个数组中循环的迭代器。我正在使用标准的includes() 函数,应该注意indexOf() >= 0 检查也会发生同样的情况。对于这个测试,我们有以下代码:

const array1 = [0, 1, 2, 3];
const array2 = [1, 2];
for(let i in array1)
    console.log(array2.includes(i));

令我惊讶的是,每个输出都返回 false 而不是预期的 false true true false 序列。怎么会这样?我知道我检查的是 i 而不是 arr[i],但 i 仍然对应于这些数组中包含的数字:0 仍然是 0,1 仍然是 1,等等。使用 arr.includes(1) 确实返回 true,那么为什么当i 也是1 时不是arr.includes(i)

【问题讨论】:

【参考方案1】:

for...in 循环遍历所有键/属性。

是字符串,不是数字,来自括号属性访问器

const array1 = [0, 1, 2, 3];
const array2 = [1, 2];
for(let i in array1)
    console.log(typeof i, i, array2.includes(i));

如果对象是可迭代对象,则 for...of 循环遍历值,由一些我不知道且现在不重要的函数定义。

const array1 = [0, 1, 2, 3];
const array2 = [1, 2];
for(let i of array1)
    console.log(typeof i, i, array2.includes(i));

还知道当array1 不是从 0 开始的递增整数列表时,您的 for...in 循环并没有按照您的预期执行:

const array1 = [6, 4, 3, 95, 45, 3, 3];
for(let i in array1)
    console.log(typeof i, i);

所以你应该做的就是使用for...of(或Array.prototype.forEach,或传统的for (let i = 0; i < arr.length; i++)循环等),除非你需要for...in(几乎从不),或者在这种情况下我猜你可以在检查它是否在Array.prototype.includes上调用之前将字符串转换为一个数字

const array1 = [0, 1, 2, 3];
const array2 = [1, 2];
for(let i in array1)
    console.log(i, array2.includes(parseInt(i)));

【讨论】:

这解释了它:如果i 存储为可以解释它的字符串,我很困惑。这意味着使用 Number(i) 在理论上也应该有效。【参考方案2】:

您应该将for..of 用于数组,将for..in 用于对象

for...of 语句创建一个循环遍历可迭代对象, 包括:内置字符串、数组、类数组对象(例如,参数 或 NodeList)、TypedArray、Map、Set 和用户定义的可迭代对象。它 调用自定义迭代钩子,其中包含要执行的语句 对象的每个不同属性的值。 -MDN

const array1 = [0, 1, 2, 3];
const array2 = [1, 2];
for (let i of array1) console.log(array2.includes(i));

备用选项

您也可以在此处使用 forEach 来获得完全相同的结果:

const array1 = [0, 1, 2, 3];
const array2 = [1, 2];
array1.forEach((val) => console.log(array2.includes(val)));

【讨论】:

这似乎可行,谢谢。如果我使用of 而不是in,我的代码中似乎还有其他内容,所以我可能还需要找到另一种方法,但这对将来的参考很有用。【参考方案3】:

for...in 循环遍历所有属性,而不是值。数组是对象,它们的属性是0 ... array.length,所以for循环内的i1234

您应该改用for...of 循环:

const array1 = [0, 1, 2, 3];
const array2 = [1, 2];
for(let i of array1)
    console.log(array2.includes(i));

【讨论】:

这似乎可行,谢谢。如果我使用of 而不是in,我的代码中似乎还有其他内容,所以我可能还需要找到另一种方法,但这对将来的参考很有用。

以上是关于检查数组中是不是存在迭代器时,array.includes 不起作用[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在迭代值之前检查 jq 中是不是存在“键”

对于每个数组值,检查它是不是在 json 数组中。如果是跳过 json 数组进行下一次迭代

在数组迭代期间检查当前元素是不是是最后一个元素

Java 迭代器对 Next() 施加条件

检查 JSON 数组中是不是存在值,如果不存在则检查下一个数组(Swift / SwiftUI)

检查数组 React 中是不是存在项目