2016-08-11 33 views
-1

根據數組內容動態分配對象的最佳做法是什麼?這是我現在正在做的方式,它的工作原理,但它似乎有點骯髒。製作像對象一樣的類是更好的方法嗎?在那種情況下我會怎麼做? 例如:從數組中動態分配對象 - 最佳實踐 - nodejs javascript

var names = ["test", "foo", "bar"]; 
var dict = {}; 
// init values 
names.forEach(function(n){ 
    dict[n] = {}; 
    dict[n].property1 = false; 
    dict[n].property2 = true; 
    dict[n].property3 = ""; 
}); 
+1

似乎很好,但你真的沒有使用數組值的任何東西?你可以減少它 - >'names.reduce(function(a,b,i){return a [i] = {p1:false,p2:true,p3:「」},a},{}) ' – adeneo

+0

@adeneo除非是箭頭函數,否則這個逗號技巧並不是真的必要。 'a [i] = {p1:false,p2:true,p3:「」};返回a是一樣簡短,並且不那麼令人困惑。 – 4castle

回答

1

我會創建工廠函數來從數組創建對象。在該函數內部,您可以使用例如Array.prototype.reduce()來初始化對象:

var makeMyDict = function(arr) { 
    return arr.reduce(function(r, n) { 
     r[n] = { 
      property1: false, 
      property2: true, 
      property3: "" 
     }; 
     return r; 
    }, {}); 
} 

var names = ["test", "foo", "bar"]; 

var dict = makeMyDict(names); 
+0

來吧,夥計,你怎麼可以放棄一個機會來命名這個函數holdMyDict?兒子,我很失望。 – Will

1

您的方法看起來不錯。您始終可以使用reduce來構建累積的對象。

const props = { 
    property1: false, 
    property2: true, 
    property3: `` 
}; 

const names = [`foo`, `bar`, `baz`]; 

const dict = names.reduce((a, x) => { 
    a[x] = {}; 
    for (let p in props) a[x][p] = props[p]; 
    return a; 
}, {}); 

// Or using object spread (requires babel at the moment) 
const dict = names.reduce((a, x) => (a[x] = {...props}, a), {}); 

console.log(dict); 

{ foo: { property1: false, property2: true, property3: '' }, 
    bar: { property1: false, property2: true, property3: '' }, 
    baz: { property1: false, property2: true, property3: '' } } 
+0

我也喜歡這個答案。這些屬性就像一個'struct'。看起來很清楚。謝謝 –