2017-02-11 9 views
1

Я недавно начал использовать язык программирования JavaScript. Нет, это не мой первый язык, но это один из моих первых применений. Я пытаюсь создать шахматную программу, используя возможности холста HTML5. Я использую цикл for для создания массива всех позиций для шахматных фигур. Я столкнулся с одной проблемой; он сохраняет все координаты как неопределенные. Bellow - это код для функций, которые хранят эти значения.JavaScript - все, что хранится в for store, не определено

var board = []; 
 

 
function createBoard() { 
 
    var integer = 0; 
 
    for (var i = 0; i < 8; i++) { 
 
    for (var j = 0; j < 8; j++) { 
 
     board[integer] = new Position(i, j); 
 
     integer++; 
 
    } 
 
    } 
 
} 
 

 
function replacePosition(position1, position2) { 
 
    var i = board.indexOf(position1); 
 
    board[i] = position2; 
 
} 
 

 
function getPosition(x, y) { 
 
    for (var position in board) { 
 
     console.log("(" + position.x + "," + position.y + ")"); 
 
     if (position.x == x && position.y == y) { 
 
     return position; 
 
     } 
 
    } 
 
    return null;

Вот класс установки, если вам это нужно.

class Position { 
 
    constructor(x, y) { 
 
    this.x = x; 
 
    this.y = y; 
 
    this.piece = null; 
 
    } 
 
}

Я бегу createBoard(), а затем я пытаюсь использовать GetPosition(). Я говорю, что мой код не работает с нулевым значением. Если я посмотрю на консоль, он продолжает вести журнал »(undefined, undefined)». Я сделал небольшое исследование, но единственное, что я смог найти, было асинхронным. Я попытался изучить это, но я не мог понять, как это исправить. Кто-нибудь знает, как это исправить?

ответ

1

A for ... in цикл в JavaScript выполняет итерации по объекту имена объекта, а не значения свойства.

You shouldn't use a for ... in loop anyway. Используйте for петлю с числовым индексной переменной, либо использовать .forEach() или один из других методов Массив итератора (в данном случае, вероятно, .find()):

function getPosition(x, y) { 
    for (var i = 0; i < board.length; ++i) { 
    var position = board[i]; 
    console.log("(" + position.x + "," + position.y + ")"); 
    if (position.x == x && position.y == y) { 
     return position; 
    } 
    } 
    return null; 
} 

или

function getPosition(x, y) { 
    return board.find(function(p) { 
    if (p && p.x == x && p.y == y) 
     return p; 
    return false; 
    }; 
} 
+0

Проверьте последний код! Я думаю, вы имели в виду 'p.x == x && p.y == y' not' position.x == ... '! –

+0

@ibrahimmahrir действительно, спасибо! Обновлен ответ. – Pointy

+1

Одна вещь просто заменит весь массив 'find' на:' return p.x == x && p.y == y'. Поскольку 'find' calback должен возвращать логическое значение, а не объект! –

2

Я бы просто сделал

function getPosition(x, y) { 
    return board[x*8 + y]; 
} 
+0

Да, это очень хороший момент :) – Pointy

 Смежные вопросы

  • Нет связанных вопросов^_^