2016-02-28 170 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