2010-12-13 47 views
8

Tôi có một đối tượng Javascript lồng nhau nhưJavascript: giá trị truy cập lồng trong dữ liệu JSON sử dụng tên biến động

var data = { 'name': { 'heading': 'Name', 'required': 1, 'type': 'String' }, 
      'profile': { 
        'age': { 'heading': 'Age', 'required': 0, 'type': 'Number' }, 
        'phone': { 'heading': 'Phone', 'required': 0, 'type': 'String'}, 
        'city': { 'heading': 'City', 'required': 0, 'type': 'String'}, 
        }, 
      'status': { 'heading': 'Status', 'required': 1, 'type': 'String' } 
      }; 

Ở đây, tôi có thể truy cập vào các lĩnh vực như data.profile.age.type hoặc data.name.type . Không có vấn đề Và nếu tôi có tên biến động, tôi có thể truy cập như dưới đây. Một lần nữa, không có vấn đề gì.

f = 'profile'; data[f].age.type 

Nhưng, ở đây tôi có tên biến như 'tên', 'profile.age', 'profile.city' vv và rõ ràng là tôi không thể truy cập chúng như f 'profile.age' =; dữ liệu [f] .type sẽ không hoạt động.

Có ai có thể hướng dẫn tôi cách truy cập chúng (get/set) theo cách thẳng thắn và đơn giản nhất không?

Lưu ý: Tôi đã thử cách này và nó hoạt động để có được.

data.get = function(p) { o = this; return eval('o.'+p); }; 
f = 'profile.age'; data.get(f).name; 

mặc dù bộ dường như không đủ đơn giản. Xin vui lòng cho tôi biết, nếu có giải pháp tốt hơn để có được và thiết lập là tốt.

+2

Bạn đã đúng để hỏi câu hỏi này trên SO. Bất cứ lúc nào bạn thấy mình sử dụng eval trong Javascript, bạn gần như chắc chắn đang làm điều sai trái. –

+0

Cảm ơn bạn đã cho tôi biết về eval. Có thể được eval là ác! :-) – rsmoorthy

+0

Bạn đã nói điều đó. Hãy xem gợi ý cuối cùng được cung cấp tại đây: http://javascript.crockford.com/code.html –

Trả lời

7

Không sử dụng eval trừ khi thật cần thiết. :) Ít nhất trong trường hợp này, có những cách tốt hơn để làm điều đó - bạn có thể chia tên lồng nhau thành những phần riêng biệt và lặp qua chúng:

data.get = function(p) { 
    var obj = this; 

    p = p.split('.'); 
    for (var i = 0, len = p.length; i < len - 1; i++) 
    obj = obj[p[i]]; 

    return obj[p[len - 1]]; 
}; 

data.set = function(p, value) { 
    var obj = this; 

    p = p.split('.'); 
    for (var i = 0, len = p.length; i < len - 1; i++) 
    obj = obj[p[i]]; 

    obj[p[len - 1]] = value; 
}; 
+0

Cảm ơn. Phản ứng rất nhanh và hữu ích. – rsmoorthy

8

Bạn chỉ có thể lồng khung:

var a = 'name', b = 'heading'; 
data[a][b]; // = `Name` 
+1

điều này không trả lời được câu hỏi nào cả ... – vsync

+1

@vsync: Chắc chắn rồi. Tôi nói rằng thay vì 'var a = 'name.heading'; dữ liệu [a] ', bạn có thể sử dụng các bộ khung liên tiếp để truy cập các cấp độ sâu hơn của đối tượng. Vì vậy, nếu bạn biết bạn đang tìm kiếm một cái gì đó trong đối tượng 'profile',' var a = 'profile', b = 'age'; dữ liệu [a] [b] 'hoạt động. Rõ ràng, nếu bạn cần xử lý một chuỗi tùy ý, các câu trả lời khác cho thấy cách thực hiện điều đó. Đây là một thay thế nếu ai đó không cần sự phức tạp của việc phân tích các chuỗi '" a.b.c.d "' tùy ý. – josh3736

2

Có lẽ một chức năng mà mất trong đường dẫn đến tài sản mà bạn đang quan tâm và phá vỡ nó thành thẻ đại diện cho tài sản. Một cái gì đó như thế này (điều này là rất khó khăn, tất nhiên):

data.get = function(path) { 
    var tokens = path.split('.'), val = this[tokens[0]]; 
    if (tokens.length < 2) return val; 
    for(var i = 1; i < tokens.length; i++) { 
    val = val[tokens[i]]; 
    } 
    return val; 
} 

dụ:

var f = 'one.two'; 
    var data = { one: {two:'hello'}}; 
    data.get = /* same as above */; 

    var val = data.get(f); 
0

này sử dụng jquery.each() để đi qua xuống một cây json bằng cách sử dụng một biến chuỗi có thể hoặc không thể chứa một hoặc nhiều ".". Bạn có thể chuyển vào một mảng và bỏ qua .split();

pathString = cái gì đó như "person.name"

jsonObj = cái gì đó như { "người": { "tên": "valerie"}}.

function getGrandchild(jsonObj, pathString){ 
    var pathArray = pathString.split("."); 
    var grandchild = jsonObj; 
    $.each(pathArray, function(i, item){ 
     grandchild = grandchild[item]; 
    }); 
    return grandchild; 
}; 

lợi nhuận "valerie"

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