1

参照によって変数を渡そうとしていますが、期待どおりに機能しません (または期待どおりに機能しません)。

boardCopyが呼び出された後も空のままで、callMeMaybeその理由がわかりません。最初の関数で既にボードをコピーboardCopy = board.slice(0)し、2 番目の関数でこれを行わない場合、それは機能しますが、実際のボードははるかに大きくcallMeAnytimeなり、再帰関数になり、はるかに複雑になるため、それはオプションではありません。 .

callMeAnytime(3, [], [1, 0, 1, 1]);

function callMeAnytime(index, moves, board) {
    for (var i = index; i >= 0; i--) {
        var boardCopy = [];
        callMeMaybe(i, board, boardCopy)
        console.log(board); // [1, 1, 1, 1]
        console.log(boardCopy); // []
    }
}

function callMeMaybe(i, board, boardCopy) {
    if (board[i] == 1) {
        boardCopy = board.slice(0);
        boardCopy[i] = 0;
        console.log(board); // [1, 1, 1, 1]
        console.log(boardCopy); // [1, 1, 1, 0]
    }
}
4

2 に答える 2

2

前述のように、JavaScript は値渡しを使用します。オブジェクトの要素/プロパティを変更できますが、オブジェクト自体を置き換えることはできません。sliceオブジェクトに新しい配列を返します。代わりに、このようなものが必要になります。

slice は元の配列を変更しませんが、元の配列からスライスされた要素のコピーを含む新しい「1 レベルの深さ」のコピーを返します。

function callMeMaybe(i, board, boardCopy) {
    if (board[i] == 1) {
        //boardCopy = board.slice(0);
        var length = board.length,
            j = 0;

        boardCopy.length = 0;
        while (j < length) {
            if (Object.prototype.hasOwnProperty.call(board, j)) {
                boardCopy[j] = board[j];
            }

            j += 1;
        }

        boardCopy[i] = 0;
        console.log(board);
        console.log(boardCopy);
    }
}
于 2013-06-23T00:34:56.383 に答える