2012-11-04 39 views
8

tôi có một đối tượng nhưChuyển đổi đối tượng JavaScript phức tạp để đối tượng ký hiệu dấu chấm

{ "status": "success", "auth": { "code": "23123213", "name": "qwerty asdfgh" } } 

Tôi muốn chuyển đổi nó để chấm ký hiệu (một cấp) phiên bản như:

{ "status": "success", "auth.code": "23123213", "auth.name": "qwerty asdfgh" } 

Hiện nay tôi đang chuyển đổi đối tượng bằng tay bằng cách sử dụng các lĩnh vực nhưng tôi nghĩ rằng nên có một cách tốt hơn và chung chung hơn để làm điều này. Có cái gì không?

Lưu ý: Có một số ví dụ cho thấy cách ngược lại, nhưng tôi không thể tìm thấy phương pháp chính xác.

Lưu ý 2: Tôi muốn nó để sử dụng với ràng buộc tác vụ điều khiển máy chủ của tôi.

+1

phân tích chuỗi JSON ... iterata qua nó subitems và sau đó chuyển đổi nó trở lại JSON chuỗi – Reflective

+1

@Elias Văn Ootegem: Nó không phải là một định danh hợp lệ, nhưng mỗi chuỗi là một tên thuộc tính hợp lệ . – pimvdb

+0

sau khi phân tích cú pháp, bạn có thể truy cập 'mã' bằng' author.code' vì 'auth' là một đối tượng và' mã' là thuộc tính của đối tượng này – Reflective

Trả lời

18

Bạn đệ quy có thể thêm các thuộc tính cho một đối tượng mới, và sau đó chuyển sang JSON:

var res = {}; 
(function recurse(obj, current) { 
    for(var key in obj) { 
    var value = obj[key]; 
    var newKey = (current ? current + "." + key : key); // joined key with dot 
    if(value && typeof value === "object") { 
     recurse(value, newKey); // it's a nested object, so do it again 
    } else { 
     res[newKey] = value; // it's not an object, so set the property 
    } 
    } 
})(obj); 
var result = JSON.stringify(res); // convert result to JSON 
+0

Tôi đã viết một hàm khác với tính năng tiền tố. Tôi không thể chạy mã của bạn nhưng tôi đã nhận được câu trả lời. Cảm ơn – vardars

1

tôi đã viết một chức năng với tính năng prefix. Tôi không thể chạy mã của bạn nhưng tôi đã nhận được câu trả lời. Cảm ơn

https://github.com/vardars/dotize

var dotize = dotize || {}; 

dotize.convert = function(jsonobj, prefix) { 
    var newobj = {}; 

    function recurse(o, p, isArrayItem) { 
     for (var f in o) { 
      if (o[f] && typeof o[f] === "object") { 
       if (Array.isArray(o[f])) 
        newobj = recurse(o[f], (p ? p + "." : "") + f, true); // array 
       else { 
        if (isArrayItem) 
         newobj = recurse(o[f], (p ? p : "") + "[" + f + "]"); // array item object 
        else 
         newobj = recurse(o[f], (p ? p + "." : "") + f); // object 
       } 
      } else { 
       if (isArrayItem) 
        newobj[p + "[" + f + "]"] = o[f]; // array item primitive 
       else 
        newobj[p + "." + f] = o[f]; // primitive 
      } 
     } 
     return newobj; 
    } 

    return recurse(jsonobj, prefix); 
}; 
+1

Nếu nó hoạt động, thì điều đó là tốt, nhưng mã này yêu cầu mỗi tên thuộc tính phải có ít nhất một dấu chấm trong đó. Đó không phải là trường hợp của 'thành công'. – pimvdb

+0

vâng tôi nhận ra rằng, và cố gắng sửa chữa bằng cách sử dụng var toàn cầu. :) – vardars

+0

thư viện github được cập nhật, có một số kiểm tra. Tôi không thể cập nhật thường xuyên câu trả lời này, xin lỗi. – vardars

4

Đây là một sửa chữa/hack cho khi bạn nhận được undefined cho tiền tố đầu tiên. (Tôi đã làm)

var dotize = dotize || {}; 

dotize.parse = function(jsonobj, prefix) { 
    var newobj = {}; 
    function recurse(o, p) { 
    for (var f in o) 
    { 
     var pre = (p === undefined ? '' : p + "."); 
     if (o[f] && typeof o[f] === "object"){ 
     newobj = recurse(o[f], pre + f); 
     } else { 
     newobj[pre + f] = o[f]; 
     } 
    } 
    return newobj; 
    } 
    return recurse(jsonobj, prefix); 
}; 
Các vấn đề liên quan