2013-08-29 44 views
18

Tôi có một obj JSON, sau một số thao tác (như xóa một số phần), tôi in nó và mọi thứ có vẻ tốt ngoại trừ việc tôi có một số giá trị null. Làm thế nào để loại bỏ chúng?đệ quy loại bỏ giá trị null từ đối tượng JavaScript

tôi sử dụng JSON.stringify(obj, null, 2) phương pháp in, và đây là những gì nó trông giống như:

{ 
    "store": { 
     "book": [ 
      null, 
      { 
       "category": "fiction", 
       "author": "Evelyn Waugh", 
       "title": "Sword of Honour", 
       "price": 12.99 
      }, 
      null, 
      { 
        "category": "fiction", 
        "author": "J. R. R. Tolkien", 
        "title": "The Lord of the Rings", 
        "isbn": "0-395-19395-8", 
        "price": 22.99 
      } 
     ], 
     "bicycle": { 
      "color": "red", 
      null, 
      "price": 19.95 
     } 
    } 
} 

Tôi muốn nó được nhiều nhỏ gọn và khá sạch (loại bỏ các thêm 3 null giá trị):

{ 
    "store": { 
     "book": [ 
      { 
       "category": "fiction", 
       "author": "Evelyn Waugh", 
       "title": "Sword of Honour", 
       "price": 12.99 
      }, 
      { 
        "category": "fiction", 
        "author": "J. R. R. Tolkien", 
        "title": "The Lord of the Rings", 
        "isbn": "0-395-19395-8", 
        "price": 22.99 
      } 
     ], 
     "bicycle": { 
      "color": "red", 
      "price": 19.95 
     } 
    } 
} 
+5

'bicycle' bạn không phải là cú pháp hợp lệ vì của 'null'. –

+1

Tôi tự hỏi việc triển khai thực hiện 'JSON.stringify' nào tạo ra JSON không hợp lệ. –

+0

bỏ qua yếu tố xe đạp, bạn ở ngay đây và đó là lỗi của tôi – lauxp

Trả lời

4

Sửa mảng book của bạn đủ dễ dàng - bạn chỉ cần lọc ra các giá trị rỗng. Cách đơn giản nhất có lẽ sẽ được xây dựng một mảng mới và giao lại nó:

var temp = []; 
var i; 
for (i = 0; i < obj.store.book.length; ++i) { 
    if (obj.store.book[i] != null) { 
     temp.push(obj.store.book[i]); 
    } 
} 
obj.store.book = temp; 

Tôi chắc rằng có rất nhiều cách khác, như sử dụng jQuery, hoặc filter chức năng (mà tôi tin là không có sẵn trong cũ trình duyệt). Bạn cũng có thể lặp qua mảng và splice ra khỏi các giá trị rỗng. Tôi chỉ tìm cách này dễ đọc nhất.

0

tôi sử dụng mã ở đây

Remove empty elements from an array in Javascript

sau đó bạn có thể gọi nó như

JSON.stringify (obj.clean (null), null, 2)

Bạn sẽ cần để sửa đổi mã để làm việc với các đối tượng quá (hoặc sử dụng mã như bên trong các đối tượng)

+0

nếu obj không phải là mảng, không có phương pháp làm sạch lỗi .. – lauxp

+0

Có, Thats lý do tại sao tôi nói hoặc sửa đổi hoặc chạy nó bên trong các đối tượng – exussum

1

Làm thế nào để bạn xóa các phần của bạn?

Xóa phần tử mảng với toán tử delete để lại một lỗ trong mảng. Thay vào đó, bạn nên sử dụng Array.splice có thể xóa đúng phần tử khỏi mảng.

10
// Iterate the array from back to front, removing null entries 
for (var i=obj.store.book.length;i--;){ 
    if (obj.store.book[i]===null) obj.store.book.splice(i,1); 
} 

Nếu bạn muốn loại bỏ tất cả null giá trị đệ quy từ cả hai đối tượng và mảng:

// Compact arrays with null entries; delete keys from objects with null value 
function removeNulls(obj){ 
    var isArray = obj instanceof Array; 
    for (var k in obj){ 
    if (obj[k]===null) isArray ? obj.splice(k,1) : delete obj[k]; 
    else if (typeof obj[k]=="object") removeNulls(obj[k]); 
    } 
} 

Seen trong hành động:

var o = { 
    "store": { 
    "book": [ 
     null, 
     { 
     "category": "fiction", 
     "author": "Evelyn Waugh", 
     "title": "Sword of Honour", 
     "price": 12.99 
     }, 
     null, 
     { 
      "category": "fiction", 
      "author": "J. R. R. Tolkien", 
      "title": "The Lord of the Rings", 
      "isbn": "0-395-19395-8", 
      "price": 22.99 
     } 
    ], 
    "bicycle": { 
     "color": "red", 
     "bad": null, 
     "price": 19.95 
    } 
    } 
} 

removeNulls(o); 

console.log(JSON.stringify(o,null,2)); 
// { 
// "store": { 
//  "book": [ 
//  { 
//   "category": "fiction", 
//   "author": "Evelyn Waugh", 
//   "title": "Sword of Honour", 
//   "price": 12.99 
//  }, 
//  { 
//   "category": "fiction", 
//   "author": "J. R. R. Tolkien", 
//   "title": "The Lord of the Rings", 
//   "isbn": "0-395-19395-8", 
//   "price": 22.99 
//  } 
//  ], 
//  "bicycle": { 
//  "color": "red", 
//  "price": 19.95 
//  } 
// } 
// } 
+0

làm thế nào để đệ quy iterate một đối tượng để áp dụng thói quen này? xem xét tôi không có ý tưởng về cấu trúc của đối tượng, store.book chỉ là một ví dụ tôi đã viết ở đây .. Tôi là một người Javascript mới hoàn toàn – lauxp

+0

Tôi đã thêm một triển khai sẽ đệ quy đệ quy các đối tượng/mảng và xóa ' null' giá trị. – Phrogz

+0

cảm ơn, không biết tại sao nó không bao giờ rơi vào chi nhánh 'if' này: if (obj [k] === null), hm .. – lauxp

33

tôi phải giải quyết một vấn đề tương tự, tuy nhiên tôi muốn xóa không chỉ các giá trị null mà còn không xác định, NaN, trống Chuỗi, trống mảngtrống đối tượng giá trị, đệ quy, bằng cách kiểm tra đối tượng lồng nhau và mảng cũng lồng nhau.

Chức năng sau đây được sử dụng Lo-Dash:

function pruneEmpty(obj) { 
    return function prune(current) { 
    _.forOwn(current, function (value, key) { 
     if (_.isUndefined(value) || _.isNull(value) || _.isNaN(value) || 
     (_.isString(value) && _.isEmpty(value)) || 
     (_.isObject(value) && _.isEmpty(prune(value)))) { 

     delete current[key]; 
     } 
    }); 
    // remove any leftover undefined values from the delete 
    // operation on an array 
    if (_.isArray(current)) _.pull(current, undefined); 

    return current; 

    }(_.cloneDeep(obj)); // Do not modify the original object, create a clone instead 
} 

Ví dụ, nếu bạn gọi phương pháp này với đối tượng đầu vào sau:

var dirty = { 
    key1: 'AAA', 
    key2: { 
    key21: 'BBB' 
    }, 
    key3: { 
    key31: true, 
    key32: false 
    }, 
    key4: { 
    key41: undefined, 
    key42: null, 
    key43: [], 
    key44: {}, 
    key45: { 
     key451: NaN, 
     key452: { 
     key4521: {} 
     }, 
     key453: [ {foo: {}, bar:''}, NaN, null, undefined ] 
    }, 
    key46: '' 
    }, 
    key5: { 
    key51: 1, 
    key52: ' ', 
    key53: [1, '2', {}, []], 
    key54: [{ foo: { bar: true, baz: null }}, { foo: { bar: '', baz: 0 }}] 
    }, 
    key6: function() {} 
}; 

Nó sẽ đệ quy loại bỏ tất cả các "xấu "các giá trị, chỉ giữ cho các giá trị mang theo một số thông tin.

var clean = pruneEmpty(dirty); 
console.log(JSON.stringify(clean, null, 2)); 

{ 
    key1: 'AAA', 
    key2: { 
    key21: 'BBB' 
    }, 
    key3: { 
    key31: true, 
    key32: false 
    }, 
    key5: { 
    key51: 1, 
    key52: ' ', 
    key53: [1, '2'], 
    key54: [{ foo: { bar: true }}, { foo: { baz: 0 }}] 
    } 
}; 

Hy vọng điều đó sẽ hữu ích!

+1

Một trong những câu trả lời hay nhất ... (y) –

2

Sau đây là một sửa đổi cho câu trả lời của @Phrogz. Nếu book [3] cũng là null, câu trả lời được đưa ra sẽ không loại bỏ null cuối cùng vì độ dài của mảng sẽ nhỏ hơn k trong vòng lặp của vòng lặp cuối cùng.

Sau đây sẽ làm việc bằng cách thực hiện một cuộc gọi thứ hai để mảng:

function removeNulls(obj) { 
    var isArray = obj instanceof Array; 
    for (var k in obj) { 
    if (obj[k] === null) isArray ? obj.splice(k, 1) : delete obj[k]; 
    else if (typeof obj[k] == "object") removeNulls(obj[k]); 
    if (isArray && obj.length == k) removeNulls(obj); 
    } 
    return obj; 
} 
Các vấn đề liên quan