Процесс: в игре, которую я создаю, есть цикл for , который должен сохранять значение в массиве. Это значение меняется с каждой итерацией. Проблема: когда цикл завершен, все элементы массива идентичны, и все они показывают самое последнее значение.
Я знаю, что эта проблема встречается часто, и за последние 2 дня я предпринял множество различных изменений и попыток решить ее.

0) Я пытался разделить вещи на отдельные функции.
1) Я попытался определить счетчики циклов с помощью «let», чтобы они имели локальную область видимости.
2) Я попытался обернуть свое назначение в самовыполняющуюся функцию, чтобы это произошло немедленно, сохранив значение currentOn до того, как следующая итерация цикла изменит его. Мой счетчик - это переменная c.

(function(c2, currentlyOn2) {
  onAtSameTime[c2] = currentlyOn2;
  return 0;
})(c, currentlyOn);

3) Я попробовал попытку № 2 с добавленной функцией возврата функции, которая все еще не сохраняла значение currentOn. В любом случае, этот вариант мне не подходит, потому что все дело в том, что я делаю некоторые вычисления раньше времени, поэтому в моей игре будет быстрый цикл анимации.

onAtSameTime[c] = (function(currentlyOn2) {
  return function() {
    return currentlyOn2;
  };
})(currentlyOn);

Я устал бить головой об эту стену. Может кто-нибудь объяснить, что я делаю не так?

Более подробную информацию можно найти в jsfiddle, который я сделал. Проблемная область находится в строке 59, используя простое назначение:

onAtSameTime[c] = currentlyOn;
1
inthse 11 Янв 2017 в 00:12

3 ответа

Лучший ответ

onAtSameTime[c] = currentlyOn; устанавливает onAtSameTime[c] равным ссылке в currentlyOn, поскольку currentlyOn является массивом, а не примитивным значением. Эта ссылка обновляется с каждой итерацией. Вы можете обойти это, создав копию массива перед добавлением в массив onAtSameTime. Что-то вроде onAtSameTime[c] = [].concat(currentlyOn); поможет.

Посмотрите эту ветку вашего JSFiddle: https://jsfiddle.net/L2by787y/

1
Eric Gibby 10 Янв 2017 в 21:27

Вы можете сделать копию из currentlyOn для назначения onAtSameTime[c]. Это сохраняет значения, но не сохраняет ссылку на тот же массив.

onAtSameTime[c] = currentlyOn.slice(); // use copy
"use strict";
function log(text) {
    document.getElementById("logbox").innerHTML += JSON.stringify(text) + "<br>";
    return 0;
}

function whichSwitchesAreOn() {
    var currentlyOn = [],
        flickedSet,
        flickedOne,
        turningOnCheck;

    for (var c = 0; c < switchesToggled.length; c++) {
        flickedSet = switchesToggled[c];
        for (var d = 0; d < flickedSet.length; d++) {
            flickedOne = flickedSet[d];
            turningOnCheck = currentlyOn.indexOf(flickedOne);
            if (turningOnCheck == -1) {
                currentlyOn.push(flickedOne);
            } else {
                currentlyOn.splice(turningOnCheck, 1);
            }
        }
        log("currentlyOn: " + currentlyOn);
        onAtSameTime[c] = currentlyOn.slice(); // use copy
    }
    return 0;
}

var switchesToggled = [[0], [1, 2], [0], [2], []],
    onAtSameTime = [];

whichSwitchesAreOn();
log(onAtSameTime);
<div id="logbox"></div>
1
Nina Scholz 10 Янв 2017 в 22:09

Вы говорите, что пытались позволить?

Вы позволили в настоящее время On = [] внутри цикла for?

  for(var c = 0; c < switchesToggled.length; c++) {
      let currentlyOn = [];
0
Learning2Code 10 Янв 2017 в 21:16