我有一个非常简单的数组,正在检查它是否.includes()了一个值。但是它没有返回我期望的结果。
var myArray = [['noca', 'North Cascades National Park'], ['shen', 'Shenandoah National Park']];
var myItem = ['noca', 'North Cascades National Park'];
myArray.includes(myItem); //returns false为什么myArray.inclues(myItem)返回false?这似乎是世界上最简单的事情。它应该返回true。
发布于 2021-04-07 22:10:28
检查一个数组是否包含另一个数组是很棘手的。正如我在注释中所说,['noca'] === ['noca']返回false,因为这是两个不同的数组。
另一方面,JSON.stringify(['noca']) === JSON.stringify(['noca'])返回true,因为它比较两个字符串,所以您可以使用它:
var myArray = [['noca', 'North Cascades National Park'], ['shen', 'Shenandoah National Park']];
var myItem = ['noca', 'North Cascades National Park'];
const checkContains = (parent, child) => parent.some(arr => JSON.stringify(arr)===JSON.stringify(child))
console.log( checkContains(myArray, myItem) )
console.log( checkContains(myArray, ["test"]) )
console.log( checkContains(myArray, ["noca"]) ) // No false positive (works as intended)
发布于 2021-04-07 21:50:03
以下是从该答案中采用的内容:
https://stackoverflow.com/a/48538239/2096053
var datas= [
["aaa", "bbb"],
["ddd", "eee"]
];
function exists(arr, search) {
return arr.some(row =>
Array.isArray(row) &&
Array.isArray(search) &&
row.length === search.length &&
row.every((val, index) => val === search[index])
)
};
console.log(exists(datas, ['aaa', 'bbb'])); // TRUE
console.log(exists(datas, ['aaa'])); // FALSE
console.log(exists(datas, ['xxx'])); // FALSE
console.log(exists(datas, 'xxx')); // FALSE
您需要结合使用some和includes来正确遍历阵列。
我已经更新了这个答案来搜索数组。
发布于 2021-04-07 21:47:01
这是一种预期的行为,因为数组是一个对象,并且它被引用。因此,要比较的数组元素和实际元素将不相等,Array.prototype.includes()将返回false。
如果你尝试跟随,它将返回true。
var myItem = ['noca', 'North Cascades National Park'];
var myArray = [myItem, ['shen', 'Shenandoah National Park']];
myArray.includes(myItem); //returns truehttps://stackoverflow.com/questions/66987374
复制相似问题