2013-06-19 2 views
0

다음 코드에 문제가 있습니다. 의도하지 않은 일련의 개체에서 중복 된 출력

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} 

왜이 코드가 제거되지 않은 : 내가 가끔 outputs with duplicates (image) 같은 얻을 것이다,
{x: val, y: val2} 

그러나

로 포맷 객체의 배열에서 (세 번째이자 마지막 항목) 중복을 제거하도록 설계 그것이 예정되어있는대로 중복됩니까?

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]); 
}; 
+0

복제본에'{x : 7, y : 5} '가 있습니까? – elclanrs

+0

"이 코드가 중복을 제거하지 못하는 이유는 무엇입니까"또는 "어떻게하면 좋을까요?" 왜냐하면 후자라면 멋지게 창의적인 대답이 있기 때문입니다. –

답변

1

당신은 JSON이 작업을 수행 할 수있다. 그것은 종류의 해키하지만 간단한 개체에 대해 잘 작동합니다 : 그것은 하나를 발견

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; 
    } 
}; 

경우에도이 계속됩니다

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}] 
+0

OP는 10 개의 고유 한 객체를 생성하려고합니다. –

+0

다음 문제를 이해하지 못했습니다 ... – elclanrs

+0

중복 개체가 생성되면 내부 루프에 플래그가 지정되어 고유 한 개체가 만들어 질 때까지 실행 상태를 유지해야합니다. 문제는 중복이 발견 될 때 OP가 다음 반복에서 플래그를 '거짓'으로 재설정한다는 것입니다. –

4

문제는 당신의 루프입니다. 다음 시도에서 거짓 일 수 있으며 dupeerr을 false로 덮어 쓸 수 있습니다.

+0

OP는 'for'루프를 종료 할 때 'do'루프에서 dupeerr 플래그를 재설정하지 않습니다. 따라서 논리가 약간 바뀌면 당신은 옳을 것입니다. 'else if'블록의 비교는 불필요 할 수 있습니다. – asafreedman

+0

네 말이 맞아, 내 이전 의견이 잘못되었습니다. – bfavaretto

관련 문제