2013-08-09 11 views
5

मैं इस विधि का उपयोग Enums in JavaScript? हमारे कोड में enums बनाने के लिए करने के लिए enums परिवर्तित ..मूल्यों की सरणी (एक सरणी में सभी JSON मूल्यों लाना)

तो

var types = { 
    "WHITE" : 0, 
    "BLACK" : 1 
} 

अब मुद्दा है जब मैं चाहता हूँ कहीं भी सत्यापन बनाओ, मुझे यह करना है;

model.validate("typesColumn", [ types.WHITE, types.BLACK ]); 

अब वहाँ एक रास्ता मैं सिर्फ सरल परिवर्तित करने के लिए एक सरणी प्रकार में मूल्यों ताकि मैं enum के मूल्यों के सभी सूचीबद्ध करने के लिए की जरूरत नहीं है सकते हैं?

model.validate("typesColumn", types.ValuesInArray]); 

संपादित: मैं एक बहुत ही सरल enum पुस्तकालय बनाया सरल enums npm --save-dev install simple-enum (https://www.npmjs.com/package/simple-enum)

उत्पन्न करने के लिए

उत्तर

6

मैं होता

var arr = []; 
for(var i in types){ 
    var type = types[i]; 
    arr.push(type); 
} 
//arr = [0, 1] 

इस पुन: प्रयोज्य आप एक सहायक समारोह बना सकते हैं बनाने के लिए मानचित्र को एक सरणी में रूपांतरित करें और इसे types.all के रूप में संग्रहीत करें। आप एक विधि है कि यह स्वचालित रूप से करता है बना सकते हैं:

function makeEnum(enumObject){ 
    var all = []; 
    for(var key in enumObject){ 
     all.push(enumObject[key]); 
    } 
    enumObject.all = all; 
} 
+0

का पुन: उपयोग करें, मुझे लगता है कि यह सबसे अच्छा समाधान है .. मैं enums घोषित करते समय मेकएनम को कॉल कर सकता हूं, बस कॉल करने में सक्षम हूं। सभी –

+0

क्या यह भी आवश्यक है ? निश्चित रूप से इस सब के बाद संपत्ति नामों की सरणी होगी?मूल्यों की एक सरणी के बजाय '['सफेद', 'काला'] की तरह (जिसे ओपी ने अनुरोध किया है)। इसके अलावा, 'enum' एक आरक्षित शब्द है! यह क्यों स्वीकार किया गया था? ... – musefan

+0

मुझे लगता है कि ओपी ने वास्तव में गलत कार्यान्वयन को सही तरीके से देखे बिना विचार लिया। मैं इसे अन्य उपयोगकर्ताओं के लिए सही कर दूंगा, टिप्पणी के लिए धन्यवाद। 'Object.keys' के लिए – Yann

2

आप इसे एक सरणी के लिए परिवर्तित कर सकते हैं, या आप बस ऑब्जेक्ट के गुणों को पुनरावृति कर सकते हैं (जो कैसे आप सरणी वैसे भी बनाना होगा) है:

for(var i in types){ 
    var type = types[i]; 
    //in the first iteration: i = "WHITE", type = 0 
    //in the second iteration: i = "BLACK", type = 1 
} 

बस पूर्णता के लिए, आप सरणी बना सकते हैं कि विधि के साथ इस प्रकार है:

function ObjectToValueArray(obj){ 
    var arr = []; 
    for(var i in obj){ 
     var v = obj[i]; 
     arr.push(v); 
    } 
    return arr; 
} 

कौन सा तो जैसे कहा जा सकता है:

model.validate("typesColumn", ObjectToValueArray(types)); 
+0

मुझे पता है कि मैं इन में बदल सकते हैं, लेकिन इन के बाद से उपयोग किया जाता है विभिन्न स्थानों पर, मैं एक लाइन समाधान की तलाश में हूं। कुछ कार्यक्षमता जो इस कार्यक्षमता का समर्थन करती है –

+1

एक सहायक फ़ंक्शन बनाएं और उस – musefan

5
var types = { 
    "WHITE" : 0, 
    "BLACK" : 1 
} 
var typeArray = Object.keys(types).map(function(type) { 
    return types[type]; 
}); 
//typeArray [0,1] 

model.validate("typesColumn", typeArray); 

jsFiddle Demo

+1

+1। आधुनिक वातावरण के लिए आधुनिक जावास्क्रिप्ट कोड जैसे node.js! –

+0

+1, लेकिन मैं सामान्य कार्य 'मान (ओबीजे) 'के लिए' कुंजी '+' map' को फिर से प्रतिक्रिया दूंगा और फिर बस मान्य करें ("प्रकार कॉलम", मान (प्रकार)) '। – georg

1

रस अप (या लपेट) .validate ऐसी है कि वह types अर्थ के रूप में सभी सदस्यों को स्वीकार करेंगे?

var types = { 
    "WHITE" : 0, 
    "BLACK" : 1, 
    "RED" : 200 
} 

validate("foo", types.WHITE); // 0 
validate("foo", [types.WHITE, types.BLACK]); // 0,1 
validate("foo", types); // 0,1,200 

function validate(foo, values) { 
    var arr = []; 
    switch (typeof values) { 
     case "number": 
      arr.push(values); 
      break; 
     case "object": 
      if (values instanceof Array) 
       arr = values; 
      else { 
       for (var k in values) 
        arr.push(values[k]); 
      } 
      break; 
    } 
    alert(arr); 
} 
5

सरल समाधान (ES6)

आप इस तरह Object.values उपयोग कर सकते हैं:

var valueArray = Object.values(types); 

Online demo (fiddle)

संबंधित मुद्दे