Преобразование записей массива в объект с переменным количеством параметров - PullRequest
0 голосов
/ 13 июля 2020

В настоящее время у меня есть фрагмент кода, который выглядит следующим образом:

      $.when(aiFileGen, foeFileGen, foe2FileGen, playerFileGen).then(function (
        aiFiles,
        foeFiles,
        foe2Files,
        playerFiles
      ) {
        var files = _.assign({}, aiFiles, foeFiles, foe2Files, playerFiles);
        self.files(files);
        done.resolve();
      });

Снимок self.files() выглядит следующим образом:

Object {/pa/ai/unit_maps/ai_unit_map.json.ai: Object, /pa/units/sea/hover_ship/hover_ship.json.ai: Object, /pa/units/sea/fabrication_barge/fabrication_barge.json.ai: Object, /pa/units/sea/drone_carrier/drone/drone.json.ai: Object, /pa/units/sea/drone_carrier/carrier/carrier.json.ai: Object…}

Проблема с этим методом в том, что он предполагает заданное количество параметров, но количество параметров может изменяться. Поэтому я попытался преобразовать во что-то более динамичное c.

      var filesToProcess = [aiFileGen, playerFileGen];

      filesToProcess.push(foeFileGen, foe2FileGen);

      $.when.apply($, filesToProcess).always(function () {
        self.files(_.assign({}, arguments));
        done.resolve();
      });

Однако результат self.files() выглядит следующим образом:

Object {0: Object, 1: Object, 2: Object, 3: Object}

Где я ошибся в мое преобразование метода 1 в метод 2?

1 Ответ

1 голос
/ 13 июля 2020

Проблема в том, что вы всегда вызываете _.assign({}, arguments) с двумя аргументами. Вместо этого вы хотите передать каждый аргумент в arguments как отдельный аргумент в _.assign.

Это можно сделать аналогично тому, как вы также изменили вызов $.when. Однако вам сначала нужно преобразовать arguments в массив , чтобы вы могли добавить дополнительный аргумент {}.

var assignArgs = Array.prototype.push.apply([{}], arguments);
self.files(_.assign.apply(_, assignArgs);

Однако я бы рекомендовал взглянуть на синтаксис spread и rest (...). Это значительно упрощает передачу и принятие переменного количества параметров.

$.when.apply($, filesToProcess).always(function () {
  var assignArgs = Array.prototype.push.apply([{}], arguments);
  self.files(_.assign.apply(_, assignArgs);
  done.resolve();
});

// can be changed to

$.when(...filesToProcess).always(function () {
  self.files(_.assign({}, ...arguments));
  done.resolve();
});
...