检查数组中是不是存在迭代器时,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
循环内的i
是1
、2
、3
和4
。
您应该改用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 不起作用[重复]的主要内容,如果未能解决你的问题,请参考以下文章
对于每个数组值,检查它是不是在 json 数组中。如果是跳过 json 数组进行下一次迭代