Javascript 2D数组总是包含假(使用PUSH)

时间:2018-03-24 19:57:04

标签: javascript arrays

我目前正在使用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的新手。请不要苛刻我:(

2 个答案:

答案 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]]));