将数组条目转换为具有可变数量参数的对象
Converting array entries into an object with a variable number of parameters
我目前有一点代码如下:
$.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}
我把方法一转方法二哪里出错了?
问题是您总是使用 2 个参数调用 _.assign({}, arguments)
。相反,您想将 arguments
中的每个参数作为单独的参数传递给 _.assign
.
这与您更改 $.when
调用的方式类似。但是,您必须先 convert the arguments
to an array 才能添加额外的 {}
参数。
var assignArgs = Array.prototype.push.apply([{}], arguments);
self.files(_.assign.apply(_, assignArgs);
不过,我建议您看一下 spread and 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();
});
我目前有一点代码如下:
$.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}
我把方法一转方法二哪里出错了?
问题是您总是使用 2 个参数调用 _.assign({}, arguments)
。相反,您想将 arguments
中的每个参数作为单独的参数传递给 _.assign
.
这与您更改 $.when
调用的方式类似。但是,您必须先 convert the arguments
to an array 才能添加额外的 {}
参数。
var assignArgs = Array.prototype.push.apply([{}], arguments);
self.files(_.assign.apply(_, assignArgs);
不过,我建议您看一下 spread and 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();
});