我目前正在使用Javascript完成一些任务。 我在开始时创建了一个2D数组,完全是空的:
let stonearray =[[]];
现在,只要用户点击某个位置,我就会保存这些值,并希望将它们推送到数组中,以便将值保存在那里:
var posx2 = Math.floor(x/colSize)*colSize+colSize/2;
var posy2 = Math.floor(y/rowSize)*rowSize+rowSize/2;
var pusharr = [[posx2, posy2]];
stonearray.push([pusharr]);
现在我想知道数组对(pusharray的值)是否已经存储在stonearray中 - 现在它应该存在。但每当我试图检查“stonearray”是否已包含“pusharr”时,它总是说错误。 我试过这些版本来检查:
//first attempt:
var contains = stonearray.includes([pusharr]);
//second attempt:
function checkContain(stonearray,pusharr) {
let a;
alert(pusharr);
for (a = 0; a < stonearray.length; a++) {
if (stonearray[a] === pusharr) {
return true;
}
}
return false;
}
它总是返回false。但为什么?我是Javascript的新手。请不要苛刻我:(
答案 0 :(得分:1)
===
和.includes
不进行深度相等检查。你可以这样做:
const stonearr = [[1,2], [55, 22]];
function check2dArr(pushArr, arr) {
return arr.some(a => {
return pushArr[0] === a[0] && pushArr[1] === a[1];
})
}
console.log(check2dArr([1, 2], stonearr));
console.log(check2dArr([55, 21], stonearr));
答案 1 :(得分:1)
首先,您正在推送一个数组数组:stonearray.push([pusharr])
,可能需要推送如下:stonearray.push(pusharr);
let x = 1, y = 2, colSize = 1, rowSize = 2;
let stonearray = [];
var posx2 = Math.floor(x / colSize) * colSize + colSize / 2;
var posy2 = Math.floor(y / rowSize) * rowSize + rowSize / 2;
var pusharr = [
[posx2, posy2]
];
stonearray.push(pusharr);
function checkContain(stonearray, pusharr) {
let a;
for (a = 0; a < stonearray.length; a++) {
if (stonearray[a] === pusharr) {
return true;
}
}
return false;
}
console.log(checkContain(stonearray, pusharr));
现在,上面的代码段有效,因为您正在比较内存中的相同值。为了保证正确的比较,您需要比较数组中的值:
let x = 1, y = 2, colSize = 1, rowSize = 2;
let stonearray = [];
var posx2 = Math.floor(x / colSize) * colSize + colSize / 2;
var posy2 = Math.floor(y / rowSize) * rowSize + rowSize / 2;
var pusharr = [
[posx2, posy2]
];
stonearray.push(pusharr);
function checkContain(stonearray, pusharr) {
for (let a = 0; a < stonearray.length; a++) {
if (stonearray[a][0][0] === pusharr[0][0] && stonearray[a][0][1] === pusharr[0][1]) {
return true;
}
}
return false;
}
console.log(checkContain(stonearray, [[posx2, posy2]]));
使用比较元素的函数some
,直到条件为true
。
let x = 1, y = 2, colSize = 1, rowSize = 2;
let stonearray = [];
var posx2 = Math.floor(x / colSize) * colSize + colSize / 2;
var posy2 = Math.floor(y / rowSize) * rowSize + rowSize / 2;
var pusharr = [
[posx2, posy2]
];
stonearray.push(pusharr);
function checkContain(stonearray, pusharr) {
return stonearray.some(array => array[0][0] === pusharr[0][0] && array[0][1] === pusharr[0][1])
}
console.log(checkContain(stonearray, [[posx2, posy2]]));