2012-06-13 22 views
8

Tôi đã có một mảng kênh mà tôi muốn chuyển đổi thành một đơn đối tượng (channelSettings) với một sự thật sai tài sản/cho mỗi kênh.làm thế nào để xây dựng một đối tượng javascript bằng cách sử dụng một mảng và chức năng bản đồ?

Tôi đã làm việc này bằng cách sử dụng mã bên dưới nhưng có vẻ như tiết lộ. Có cách nào để làm điều đó mà không có "temp" var? Nếu tôi có thể có được điều đó, thì tôi cũng có thể có được chức năng tự thực hiện.

var channels = ["TV", "Billboard", "Spot TV"]; 


var channelSettings = function() { 
    var temp = {}; 

    channels.map(function(itm, i, a) { 
     var channel = itm.toLowerCase().replace(" ", ""); 
     temp[channel] = false; 
    }); 

    return temp; 
}(); 

Tôi đoán tôi đang cố gắng lấy hàm bản đồ để trả về đối tượng có thuộc tính thay vì mảng. Điều này có thể không? Có hướng dẫn sai không? Gợi ý?

Đây là những gì tôi hy vọng nó trông giống như cuối cùng:

var channels = ["TV", "Billboard", "Spot TV"]; 

var channelSettings = channels.map(function(itm, i, a) { 
     var channel = itm.toLowerCase().replace(" ", ""); 
     return ????; 
}); 
+1

Nó có thể là một chút dài dòng, nhưng nó cũng _clear_. Tôi muốn bỏ phiếu để rời khỏi nó như nó được. –

Trả lời

7

Sử dụng hàm .reduce() thay thế.

var channelSettings = channels.reduce(function(obj, itm) { 
     var channel = itm.toLowerCase().replace(" ", ""); 
     obj[channel] = false; 

     return obj; 
}, {}); 

DEMO:http://jsfiddle.net/MjW9T/


Tham số đầu tiên tham chiếu mục trở lại trước đây, ngoại trừ phiên đầu tiên, nơi mà nó tham chiếu hoặc là mục đầu tiên trong mảng, hoặc các hạt giống mục mà chúng tôi cung cấp dưới dạng đối tượng trống.

Tham số thứ hai tham chiếu giá trị hiện tại trong Mảng. Miễn là chúng tôi luôn trả lại obj, thông số đầu tiên sẽ luôn là đối tượng đó, cũng như giá trị trả lại cuối cùng.

+0

Giải thích hay, Thx! – DanielEli

+0

@DanielEli: Bạn được chào đón. –

0

hmm .. trông giống như gói nó trong một chức năng như thế này sẽ làm điều đó.

function toObject(arr) { 
    var rv = {}; 
    for (var i = 0; i < arr.length; ++i) 
    if (arr[i] !== undefined) rv[arr[i]] = true; 
    return rv; 
} 
3

Hàm map lấy một mảng và trả về một mảng. Không có gì khác. Nhưng bạn có thể sử dụng reduce:

var settings = ["TV", "Billboard", "Spot TV"].reduce(function(obj, item) { 
    obj[item.toLowerCase().replace(" ", "")] = false; // probably too concise 
    return obj // yay, we can skip a semi-colon here :-P 
}, {}); 

Vâng, "đang không tôi" đánh bại tôi vào nó, nhưng dù sao:
map không chỉ trả về mảng, nhưng cũng chỉ trả về mảng các độ dài tương tự như bản gốc. Nó có nghĩa là để chuyển đổi một giá trị của mảng 1: 1 thành một mảng mới. reduce có nghĩa là "giảm một mảng thành một giá trị duy nhất". Do đó việc sử dụng nó ở đây.

Nếu bạn sử dụng vòng for thẳng hoặc phương pháp forEach để thêm thuộc tính vào đối tượng, bạn cần khai báo đối tượng đó. Vì vậy, không, bạn không thể làm mà không có temp trong mã của bạn (trừ khi bạn sử dụng reduce thay vì một vòng lặp).

Thông tin thêm về MDN:

  1. bản đồ: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/map
  2. giảm: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/Reduce
+0

và một lời giải thích tuyệt vời ở đây quá! (Tôi sẽ không phải bảo vệ quyết định kiểm tra màu xanh lá cây của mình tại tòa án ..) nhiều thx! – DanielEli

+0

@RobG Ah, liên kết MDN - Tôi hoàn toàn quên thêm chúng. Cảm ơn bạn đã chỉnh sửa – Flambino

+0

Tôi đã sử dụng phiên bản rõ ràng hơn. var key = item.toLowerCase(). Thay thế ("", ""); obj [key] = false; trả lại obj – DanielEli

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