2016-03-02 126 views
0

在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陣列,以便這是可能的。

最終目標是能夠在外部模塊中分配這些方法中的每一個,而不必重複定義。

回答

5

是的,你可以使用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可能更好 –

3

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

0

嘗試在同一行的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) 
    } 
];