JS array.include() // array in array // [['a']].include(['a']) 返回 false



TL;DR:下面的JavaScript代码返回false,而我期望的是true。最好的解决方法是什么?

console.log([['a']].includes(['a']))

我正在将数组推入数组(在应用程序脚本中使用谷歌表单范围,但在常规JavaScript中的行为是相同的(。

我想检查我的父数组(我们称之为[['a'](是否包含特定的子数组(如['a'](。

不幸的是,当参数为数组时,array.includes((似乎无法按预期工作。(据我所知,上面的代码在应该为真时返回false(

我遗漏了什么吗?你认为最好的解决办法是什么?

问题在于数组比较。

console.log(['a'] == ['a']); //false

.includes()方法在被调用的数组中循环时,它会检查每个元素,看看它是否等于被测试的值,直到找到匹配项,或者检查数组中的每个元素。正如您在上面看到的,当测试的值是一个数组时,它将不起作用。

解决方法是编写自己的.includes()函数,在该函数中循环遍历父数组中的所有子数组,对于每个子数组,循环遍历每个元素,测试它是否等于测试数组中的相应元素。对此,可以使用.every()方法。

let array = [['a']];
function includesArray(parentArray, testArray) {
for (let i = 0; i < parentArray.length; i++) {
if (parentArray[i].every(function(value, index) { return value === testArray[index]})) {
return true;
}
}
return false;
}
console.log(includesArray(array, ['a'])); //true
console.log(includesArray(array, ['b'])); //false

一个快速的替代方法是比较JSON strigified数组,而不是直接比较数组。

console.log([['a']].map(x => JSON.stringify(x)).includes(JSON.stringify(['a'])))

最新更新