【问题标题】:Converting array entries into an object with a variable number of parameters将数组条目转换为具有可变数量参数的对象
【发布时间】:2020-07-13 15:09:09
【问题描述】:

我目前有一段代码如下:

      $.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…}

这种方法的问题在于它假定了一组参数,但是参数的数量可以改变。因此,我尝试转换为更动态的东西。

      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时哪里出错了?

【问题讨论】:

    标签: javascript jquery ecmascript-5


    【解决方案1】:

    问题是你总是用 2 个参数调用 _.assign({}, arguments)。相反,您希望将arguments 中的每个参数作为单独的参数传递给_.assign

    这可以与您更改$.when 调用的方式类似。但是,您必须先 convert the arguments to an array,以便添加额外的 {} 参数。

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

    不过,我建议您查看 spreadrest 语法 (...)。这使得传递和接受可变数量的参数变得更加容易。

    $.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();
    });
    

    【讨论】:

    • 不幸的是,我正在使用 Chromium 28,所以不能使用传播和休息。但是,您的回答很有魅力,谢谢。我所做的一项更正是添加一些缺少的括号self.files(_.assign.apply(_, ({}, arguments)));,否则它会返回为未定义。
    • @Quitch 这是我的错误。 apply 只接受 2 个参数,this 参数和参数列表。您提出的解决方案没有您认为的效果(您使用的是comma operator)。与调用_.assign.apply(_, arguments) 相同。这意味着您正在改变传递的第一个参数。根据您的情况,这可能不是问题。
    • 它在我的测试中似乎运行良好,但是,为了安全起见,我会考虑切换到已编辑的答案,谢谢。
    • 我最终使用了self.files(_.assign.apply(_, arguments);,因为它似乎可以正常工作。新方法正在生成有关参数类型的错误。
    猜你喜欢
    • 2021-07-29
    • 2011-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多