rút gọn đối tượng mảng một cách đệ quy trong javascript
Tôi có một mảng các đối tượng theo định dạng dưới đây:
{
"country": "India",
"children": [
{
"name": "Karnataka",
"type": "State",
"children": [
{
"name": "",
"type": "city"
},
{
"name": "Bangalore",
"type": "city"
},
{
"name": "Mangalore",
"type": "city"
}
]
},
{
"name": "Kerala",
"type": "State",
"children": [
{
"name": "",
"type": "city"
}
]
},
{
"name": "Maharashtra",
"type": "State",
"children": [
{
"name": "Mumbai",
"type": "city"
},
{
"name": "Pune",
"type": "city"
}
]
}
]
}
Mỗi đối tượng có một phần tử con chứa chi tiết của phần tử đó. Tôi cần lặp đệ quy qua đối tượng json và loại bỏ tất cả các nút mà name là chuỗi rỗng cho đến gốc. Đối với định dạng json ở trên, đầu ra sẽ như dưới đây:
{
"country": "India",
"children": [
{
"name": "Karnataka",
"type": "State",
"children": [
{
"name": "Bangalore",
"type": "city"
},
{
"name": "Mangalore",
"type": "city"
}
]
},
{
"name": "Kerala",
"type": "State",
"children": [
]
},
{
"name": "Maharastra",
"type": "State",
"children": [
{
"name": "Mumbai",
"type": "city"
},
{
"name": "Pune",
"type": "city"
}
]
}
]
}
Làm thế nào để làm điều này trong javascript đệ quy sử dụng Underscorejs.
Câu trả lời #1
Đây là một giải pháp đệ quy với Array#filter().
function filterName(a) {
if (a.name) {
if (Array.isArray(a.children)) {
a.children = a.children.filter(filterName);
}
return true;
}
}
var object = { "country": "India", "children": [{ "name": "Karnataka", "type": "State", "children": [{ "name": "", "type": "city" }, { "name": "Bangalore", "type": "city" }, { "name": "Mangalore", "type": "city" }] }, { "name": "Kerala", "type": "State", "children": [{ "name": "", "type": "city" }] }, { "name": "Maharashtra", "type": "State", "children": [{ "name": "Mumbai", "type": "city" }, { "name": "Pune", "type": "city" }] }] };
object.children.forEach(filterName);
document.write("<pre>" + JSON.stringify(object, 0, 4) + "</pre>");Câu trả lời #2
Thử cái này:
function condense(arr) {
arr.children = arr.children.map(function(c) {
c.children = c.children.filter(function(c1) {
return c1.name;
});
return c;
});
return arr;
}
Tôi lặp qua các phần tử con (với map), sau đó lọc mảng các phần tử con bằng filter. Chỉ những phần tử con có tên không phải null hoặc rỗng mới được giữ lại.
Đây là một jsfiddle.
