2016-02-28 173 views
0

我想使用一个对象为应用程序配置一些设置。我的想法是先从这样的:基于对象属性创建数组

var obj = { 
    property_one: 3; 
    property_two: 2; 
    property_three: 1; 
} 

而且我想用这个来结束:

var array = [ 
    'property_one','property_one','property_one', 
    'property_two','property_two', 
    'property_three' 
] 

我目前的解决方案是为每个属性做到这一点:

function theConstructor(){ 
    for(i=1; i <= obj.property_one; i++){ 
     this.array.push('property_one'); 
    }; 
    for(i=1; i <= obj.property_two; i++){ 
     this.array.push('property_two'); 
    }; 
    for(i=1; i <= obj.property_two; i++){ 
     this.array.push('property_two'); 
    }; 
} 

但是这很乏味,因为我可能有很多属性,并且随着应用程序的发展,这些属性可能会发生变化。

我知道可以通过object的属性这样的循环:

for (var key in obj) { 
    if (obj.hasOwnProperty(key)) { 
    array.push(key); 
    } 
} 

但是,这将值推到阵列,而不是键(作为一个字符串)。关于如何更有效地做到这一点的任何想法?

回答

2

试试这个

function theConstructor(){ 
    for (var key in obj) { 
    if (obj.hasOwnProperty(key)) { 
     for(var i=1; i <= obj[key]; i++){ 
     this.array.push(key); 
     }; 
    } 
    } 
} 
+1

你错过了声明变量'i'。 – FreeLightman

+0

谢谢@FreeLightman修正了它。 –

+0

非常感谢,不知道我怎么没有看到这回头! – Joseph

1

使用Array.prototype.reduce()

var obj = { 
 
    property_one: 3, 
 
    property_two: 2, 
 
    property_three: 1 
 
}; 
 

 
var resultArray = Object.keys(obj).reduce(function(result, curItem) { 
 
    for (var index = 0; index < obj[curItem]; index++) { 
 
    result.push(curItem); 
 
    } 
 
    return result; 
 
}, []); 
 

 
document.write(JSON.stringify(resultArray));

+0

谢谢,这是一个非常优雅的解决方案。 – Joseph