2013-07-06 43 views
5

Do sau Ví dụ:JSON.stringify danh sách trắng với các đối tượng lồng nhau

var test = { 
    "company_name": "Foobar", 
    "example": "HelloWorld", 
    "address": { 
     "street": "My Street 12", 
     "example": "BarFoo", 
     "details": "Berlin", 
    } 
} 

console.log(JSON.stringify(test, ['company_name','address','street','example'])); 

// What I actually want 
// console.log(JSON.stringify(test, ['company_name','address.street','address.example'])); 

Làm thế nào tôi có thể sử dụng chức năng stringify JSON để đối phó với các đối tượng lồng nhau đúng cách?

Vì tôi có các đối tượng JSON rất lớn, điều đó xảy ra là khóa của đối tượng lồng nhau giống với đối tượng "cha mẹ". Tôi muốn chỉ định danh sách trắng của tôi nhiều hơn.

Trả lời

2

Nếu bạn sẵn sàng chuyển sang danh sách trắng, bạn có thể thiết lập một dãy các khóa hợp lệ, có thể cung cấp khả năng lồng tương tự như bao nhiêu hệ thống làm tổ JSON (bộ tách . hoặc bất kỳ dấu tách nào của lựa chọn của bạn).

var whitelistedObj = whitelistJson(obj, ["company_name", "example", "address.street", "address.example"]); 

function whitelistJson(obj, whitelist, separator) { 
    var object = {}; 

    for (var i = 0, length = whitelist.length; i < length; ++i) { 
     var k = 0, 
      names = whitelist[i].split(separator || '.'), 
      value = obj, 
      name, 
      count = names.length - 1, 
      ref = object, 
      exists = true; 

     // fill in any empty objects from first name to end without 
     // picking up neighboring fields 
     while (k < count) { // walks to n - 1 
      name = names[k++]; 
      value = value[name]; 

      if (typeof value !== 'undefined') { 
       if (typeof object[name] === 'undefined') { 
        ref[name] = {}; 
       } 

       ref = ref[name]; 
      } 
      else { 
       exists = false; 
       break; 
      } 
     } 

     if (exists) { 
      ref[names[count]] = value[names[count]]; 
     } 
    } 

    return object; 
} 

Tôi có một JSFiddle cho thấy sử dụng của nó cũng (để đảm bảo nó thực sự làm việc trên bộ mẫu thừa nhận nhỏ của tôi).

+0

Tuyệt vời! Bạn đang thiếu để trả lại đối tượng. Nếu tôi thay đổi điều này sao cho nó hoạt động như mong đợi. Hay tôi đang bối rối? –

+0

@ChristopherWill Không gây nhầm lẫn bất cứ điều gì. Tôi quên sao chép nó trở lại từ ví dụ JS Fiddle. Điều duy nhất cần lưu ý là nó hơi khác so với chức năng mong muốn của bạn mà bạn phải đặt tên rõ ràng cho mỗi tên thuộc tính (ví dụ: '" example "' và '" address.example "'). Đó là một danh sách trắng chặt chẽ hơn, nhưng nó dễ thực hiện hơn. – pickypg

+0

Tôi thực sự thích cách tiếp cận này, đây chính xác là những gì tôi đang tìm kiếm. –

2

Bạn có thể thêm phương pháp toJSON trong đối tượng JSON khổng lồ của bạn:

var test = { 
    "company_name": "Foobar", 
    "example": "HelloWorld", 
    "address": { 
     "street": "My Street 12", 
     "example": "BarFoo", 
     "details": "Berlin", 
    }, 
    toJSON: function() { 
     return { 
      company_name: this.company_name, 
      address: { 
       street: this.address.street, 
       example: this.address.example 
      } 
     } 
    } 
} 

Và, bạn nhận được:

console.log(JSON.stringify(test)); // "{"company_name":"Foobar","address":{"street":"My Street 12","example":"BarFoo"}}" 

Hoặc, bạn có thể sử dụng một số chức năng lọc: (chức năng này sử dụng lodash)

function filter(object, keys, sep) { 
    sep = sep || '.'; 
    var result = {}; 
    _.each(keys, function (key) { 
     var keyParts = key.split(sep), 
      res = object, 
      branch = {}, 
      branchPart = branch; 

     for (var i = 0; i < keyParts.length; i++) { 
      key = keyParts[i]; 
      if (!_.has(res, key)) { 
       return; 
      } 

      branchPart[key] = _.isObject(res[key]) ? {} : res[key]; 

      branchPart = branchPart[key]; 
      res = res[key]; 
     } 

     _.merge(result, branch); 
    }); 
    return result;  
} 
console.log(JSON.stringify(filter(test, ['company_name', 'address.street', 'address.example']))); // "{"company_name":"Foobar","address":{"street":"My Street 12","example":"BarFoo"}}" 

Kiểm tra jsfiddle http://jsfiddle.net/SaKhG/

+0

Thật không may đây không phải là giải pháp cho tôi, bởi vì danh sách trắng dựa trên ngữ cảnh (và các đối tượng JSON thực sự là các đối tượng mong muốn được chuyển đổi). –

+0

Có một giải pháp khác, bây giờ tôi thử nghiệm nó trong jsfiddle. Tôi sẽ thêm nó trong vài phút nữa. –

+0

Đã cập nhật câu trả lời của tôi nhưng đã quá muộn :) –

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