Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/411.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 一系列对象中的意外重复输出_Javascript_Arrays - Fatal编程技术网

Javascript 一系列对象中的意外重复输出

Javascript 一系列对象中的意外重复输出,javascript,arrays,Javascript,Arrays,我对以下代码有问题。它用于从格式化为的对象数组中删除重复项(第三个和最后一个条目) {x: val, y: val2} 但是,我偶尔会得到如下结果: Object {x: 5, y: 0} Object {x: 7, y: 0} Object {x: 7, y: 5} Object {x: 5, y: 2} Object {x: 2, y: 1} Object {x: 7, y: 5} 为什么这段代码没有像预期的那样删除重复项 var mines = [{}]; console.log("\

我对以下代码有问题。它用于从格式化为的对象数组中删除重复项(第三个和最后一个条目)

{x: val, y: val2}
但是,我偶尔会得到如下结果:

Object {x: 5, y: 0}
Object {x: 7, y: 0}
Object {x: 7, y: 5}
Object {x: 5, y: 2}
Object {x: 2, y: 1}
Object {x: 7, y: 5}
为什么这段代码没有像预期的那样删除重复项

var mines = [{}];
console.log("\n\n\n\n\n");
for (var i = 0; i < 10; i++){ //for each mine that needs to be made
  var mine = {}; //initalize temporary object
  var dupeerr = false; //set duplication error flag to false 
                       //(will be flipped if loop needs to be re-executed)
  do{
    //generate coordinates for new mine
    //(random int between 0 and max size), then rounded to
    mine.x = Math.round(Math.random()*(8));
    mine.y = Math.round(Math.random()*(9));
    for (var j = mines.length - 1; j >= 0; j--) { //for each mine in array
      if ((mines[j].x == mine.x) && (mines[j].y == mine.y)) { //check for doubles
        dupeerr = true; //flag for re-execution
      } else if (mines[j] != mine) {
        dupeerr = false;
      }
    };
    //console.log(mines);
  } while (dupeerr || bounderr);

  mines[i] = mine;
}
var ans = [];

for (var i = 0; i < mines.length; i++) {
  ans[i] = mines[i];
  var minebtn = document.getElementById(JSON.stringify(ans[i]));
  console.log(ans[i]);
};
var mines=[{}];
console.log(“\n\n\n\n”);
对于(var i=0;i<10;i++){//对于需要制作的每个矿山
var mine={};//初始化临时对象
var dupeerr=false;//将复制错误标志设置为false
//(如果需要重新执行循环,将被翻转)
做{
//为新矿山生成坐标
//(0和最大大小之间的随机整数),然后四舍五入到
mine.x=Math.round(Math.random()*(8));
my.y=Math.round(Math.random()*(9));
对于(var j=mines.length-1;j>=0;j--)数组中的每个地雷{//
如果((mines[j].x==mine.x)和&(mines[j].y==mine.y)){//检查双精度
dupeerr=true;//重新执行的标志
}如果(地雷[j]!=地雷){
dupeerr=假;
}
};
//控制台.日志(地雷);
}while(dupeer | | bounderr);
地雷[我]=地雷;
}
var ans=[];
对于(变量i=0;i
您可以使用JSON实现这一点。它有点粗糙,但对于简单的对象应该可以很好地工作:

var arr = [{x:1,y:1}, {x:1,y:2}, {x:1,y:1}, {x:1,y:2}];

function removeDups(arr) {
  return arr
    .map(JSON.stringify)
    .filter(function(v,i,self){ return self.indexOf(v) == i })
    .map(JSON.parse);
}

console.log(removeDups(arr)); //=> [{x:1,y:1}, {x:1,y:2}]

您可以使用JSON实现这一点。它有点粗糙,但对于简单的对象应该可以很好地工作:

var arr = [{x:1,y:1}, {x:1,y:2}, {x:1,y:1}, {x:1,y:2}];

function removeDups(arr) {
  return arr
    .map(JSON.stringify)
    .filter(function(v,i,self){ return self.indexOf(v) == i })
    .map(JSON.parse);
}

console.log(removeDups(arr)); //=> [{x:1,y:1}, {x:1,y:2}]

问题在于for循环:

for (var j = mines.length - 1; j >= 0; j--) { //for each mine in array
  if ((mines[j].x == mine.x) && (mines[j].y == mine.y)) { // check for doubles
    dupeerr = true; //flag for re-execution
    break; // This should be sufficient to break you out of the for loop on true
  } else if (mines[j] != mine) {
    dupeerr = false;
  }
};

即使它找到了一个,它也会继续下去。下次尝试时,它可能为false并将dupeerr覆盖为false。

问题在于for循环:

for (var j = mines.length - 1; j >= 0; j--) { //for each mine in array
  if ((mines[j].x == mine.x) && (mines[j].y == mine.y)) { // check for doubles
    dupeerr = true; //flag for re-execution
    break; // This should be sufficient to break you out of the for loop on true
  } else if (mines[j] != mine) {
    dupeerr = false;
  }
};

即使它找到了一个,它也会继续下去。在下一次尝试中,它可能是false,并将duperr覆盖为false。

所以那里的副本是
{x:7,y:5}
?你是否会问“为什么这个代码没有删除副本”,或者“我如何做我想做的事情?”因为如果是后者,有一个很好的创造性答案。所以那里的副本是
{x:7,y:5}
?你有问题吗“为什么此代码不删除重复项”或“我如何做我想做的事情?”?“因为如果是后者,则有一个很有创意的答案。当生成重复对象时,应在内部循环中标记它,使其保持运行,直到生成唯一的对象为止。问题是OP在下一次迭代中发现dupe时将标志重置为
false
。。FWIW,您可以执行
.map(JSON.stringify)
.map(JSON.parse)
@CrazyTrain:当然,我很傻。好的,我将把问题留在这里,这是否有助于解决问题,即使它没有真正解决问题。当生成重复对象时,它应该在内部循环中被标记,保持它运行,直到生成唯一的对象为止。问题是OP在下一次迭代中发现dupe时将标志重置为
false
。。FWIW,您可以执行
.map(JSON.stringify)
.map(JSON.parse)
@CrazyTrain:当然,我很傻。好的,我将把问题留在这里,如果这有助于OP,即使它并不能真正解决问题。OP在“for”循环退出时不会重置“do”循环中的duperr标志。所以,如果逻辑稍微改变一下,你是对的。“else if”块中的比较可能是不必要的。OP从不在“for”循环退出时重置“do”循环中的Duperr标志。所以,如果逻辑稍微改变一下,你是对的。“else if”块中的比较可能是不必要的。