分配方法通过迭代数组

问题描述:

在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然后粘在一起给我们。

+0

A +很好的单行和详细的解释 – naomik

+0

切勿在生产中使用此代码。这很好,它可以用几个符号来完成,但是它浪费了大量的计算机时间来创建不必要的对象:http://jsperf.com/assign-vs-reduce/4对于这种情况,Reduce可能更好 –

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()

+0

但他一直在寻找ES6的酷感 – 2016-03-02 20:09:46

+0

够公平的,但我会继续前进,并假设使用'reduce'对于OP来说是新的,否则他已经在'forEach'解决方案中使用它' – jmcgriz

+0

你也可以使用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) 
    } 
];