0

次のコードに問題があります。としてフォーマットされたオブジェクトの配列から重複 (3 番目と最後のエントリ) を削除するように設計されています。

{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]);
};
4

2 に答える 2

4

問題は 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 に上書きします。

于 2013-06-19T01:47:18.307 に答える
1

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}]
于 2013-06-19T01:43:40.357 に答える