2013-08-09 43 views
5

tôi sử dụng phương pháp này để tạo ra Enums in JavaScript? enums trong mã của chúng tôi ..Chuyển đổi enums đến mảng các giá trị (Đưa tất cả các giá trị trong một mảng JSON)

Vì vậy

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

Bây giờ vấn đề là khi tôi muốn tạo các xác nhận hợp lệ ở bất cứ đâu, tôi phải làm điều này;

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

Có cách nào tôi chỉ đơn giản có thể chuyển đổi các giá trị thành các loại để không phải liệt kê tất cả các giá trị của enum?

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

EDIT: Tôi tạo ra một thư viện enum rất đơn giản để tạo ra sự đếm đơn giản npm --save-dev install simple-enum (https://www.npmjs.com/package/simple-enum)

Trả lời

6

tôi sẽ chuyển đổi bản đồ thành một mảng và lưu nó thành types.all. Bạn có thể tạo một phương pháp nào đó tự động:

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

Tôi nghĩ rằng đây là giải pháp tốt nhất .. Tôi có thể gọi makeEnum khi tuyên bố enums sau đó chỉ có thể gọi .all –

+0

Điều này thậm chí làm những gì được yêu cầu ? Chắc chắn sau khi 'tất cả' này sẽ là và mảng các tên thuộc tính?như '['WHITE', 'BLACK']' chứ không phải là một mảng các giá trị (mà OP đã yêu cầu). Ngoài ra, 'enum' là một từ dành riêng! Tại sao điều này được chấp nhận? ... – musefan

+0

Tôi đoán OP đã lấy ý tưởng mà không cần nhìn vào việc triển khai chính xác mà thực sự là không chính xác. Tôi sẽ sửa nó cho người dùng khác, cảm ơn cho bình luận. – Yann

2

Bạn có thể chuyển nó sang một mảng, hoặc bạn chỉ có thể lặp các thuộc tính của đối tượng (trong đó là cách bạn sẽ tạo ra mảng anyway):

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 
} 

Chỉ cần cho đầy đủ, bạn có thể tạo mảng với phương pháp đó như sau:

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

để tái sử dụng này, bạn có thể tạo một hàm helper:

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

nào có thể được gọi như vậy:

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

tôi biết rằng tôi có thể chuyển đổi này, nhưng kể từ khi chúng được sử dụng ở những nơi khác nhau, tôi đang tìm một giải pháp một dòng. Một cái gì đó rất đơn giản mà hỗ trợ chức năng này –

+1

Tạo một chức năng trợ giúp và tái sử dụng rằng – 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 cho 'Object.keys'. Mã JavaScript hiện đại cho các môi trường hiện đại như node.js! –

+0

+1, nhưng tôi muốn refactor 'keys' +' map' thành một hàm chung 'values ​​(obj)' và sau đó chỉ đơn giản là 'validate (" typesColumn ", values ​​(types))'. – georg

1

Juice lên (hoặc quấn) .validate như vậy mà nó sẽ chấp nhận types như ý nghĩa tất cả các thành viên?

giải pháp
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

Simple (ES6)

Bạn có thể sử dụng Object.values như thế này:

var valueArray = Object.values(types); 

Online demo (fiddle)

Các vấn đề liên quan