分配方法通过迭代数组
在ES5到对象,我知道它可以分配以下面的方式使用forEach
循环方法的对象:分配方法通过迭代数组
var myMethods = [
{
name: 'start',
src: someFn
},
{
name: 'stop',
src: someOtherFn
}
];
var myObject = {};
myMethods.forEach(function(method) {
myObject[method.name] = method.src;
});
在ES2015(或ES6),是可以通过创建对象来定义这些方法吗?下面是我怎么可能想到这个工作的例子:
// example
const myObject = {
[...myMethods.map((method) => method.name)]: [...myMethods.map(method) => method.src)]
}
最终的结果是这样的:
const myObject = {
start: someFn,
stop: someOtherFn
}
如果有是遍历这些方法并为它们分配方式到myObject
,我会高兴地重组myMethods
阵列,以便这是可能的。
最终目标是能够在外部模块中分配这些方法中的每一个,而不必重复定义。
是的,你可以使用Object.assign
并与计算属性名相结合的传播运营商分配给myObject
做
var myObject = Object.assign({}, ...myMethods.map(({name, src}) => ({[name]: src})));
首先,我们将myMethods
映射到一个小的单属性对象的数组,其关键值由name
属性的值和src
属性的值给出。然后我们使用传播运算符...
将这些传递给Object.assign
作为参数。 Object.assign
然后粘在一起给我们。
Reduce应该为你做的伎俩。请注意,可选的第二个参数用于在开始时以空对象开始。
var myMethods = [{
name: 'start',
src: function() {
console.log('started')
}
}, {
name: 'stop',
src: function() {
console.log('stopped')
}
}];
var myObject = myMethods.reduce((obj, method) => {
obj[method.name] = method.src;
return obj;
}, {})
console.log(myObject)
myObject.start()
myObject.stop()
但他一直在寻找ES6的酷感 – 2016-03-02 20:09:46
够公平的,但我会继续前进,并假设使用'reduce'对于OP来说是新的,否则他已经在'forEach'解决方案中使用它' – jmcgriz
你也可以使用Object.assign。例如'myMethods.reduce((obj,method)=> Object.assign(obj,{[method.name]:method.src}),{});'所以你得到了一些ES6的好处。 – loganfsmyth
尝试在同一行的myMethods
assignnemts
var myObject = {};
someFn = function(){console.log(this)};
someOtherFn = function(){console.log(this)};
var myObject = {};
someFn = function(){};
someOtherFn = function(){}
var myMethods = [
{
name: (myObject["start"] = "start"),
src: (myObject["start"] = someFn)
},
{
name: (myObject["stop"] = "stop"),
src: (myObject["stop"] = someOtherFn)
}
];
A +很好的单行和详细的解释 – naomik
切勿在生产中使用此代码。这很好,它可以用几个符号来完成,但是它浪费了大量的计算机时间来创建不必要的对象:http://jsperf.com/assign-vs-reduce/4对于这种情况,Reduce可能更好 –