明明数组包含目标值,includes()却返回false?求技术协助
问题原因
你当前的sliderInterval是二维数组:range()函数返回的是一个包含150到210步长为5的一维数组,但你用push()把这个数组直接作为元素添加到了sliderInterval中,最终sliderInterval的结构是[[150, 155, 160, ..., 180, ..., 210]]。
includes()方法只会检查当前数组的直接顶层元素,它会判断sliderInterval里有没有等于180的顶层元素,但顶层只有一个子数组,所以必然返回false。
修复方案
以下三种方式都可以解决这个问题:
方案1:用concat()替代push()
concat()会将传入数组的元素展开后添加到目标数组,而非直接添加整个数组:
function range(start, end, step = 1) { const len = Math.floor((end - start) / step) + 1 return Array(len).fill().map((_, idx) => start + (idx * step)) } let sliderInterval = []; sliderInterval = sliderInterval.concat(range(180 - 30,180 + 30,5)) console.log(sliderInterval.includes(180)); // 输出true
方案2:直接赋值给sliderInterval
既然range()已经返回了你需要的一维数组,无需先初始化空数组再push,直接赋值更简洁:
function range(start, end, step = 1) { const len = Math.floor((end - start) / step) + 1 return Array(len).fill().map((_, idx) => start + (idx * step)) } let sliderInterval = range(180 - 30,180 + 30,5); console.log(sliderInterval.includes(180)); // 输出true
方案3:扁平化数组后再检查
如果必须保留push的添加方式(比如后续还要追加其他元素),可以用flat()将二维数组转为一维后再检查:
function range(start, end, step = 1) { const len = Math.floor((end - start) / step) + 1 return Array(len).fill().map((_, idx) => start + (idx * step)) } let sliderInterval = []; sliderInterval.push(range(180 - 30,180 + 30,5)) console.log(sliderInterval.flat().includes(180)); // 输出true
内容的提问来源于stack exchange,提问作者Vanda Nagy
相关产品推荐
相关产品推荐

