2016-08-11 66 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'。看起来很清楚。谢谢 –