2016-05-15 32 views
17

Tôi có đối tượng json sau:Làm thế nào để lọc một đối tượng json phức tạp bằng cách sử dụng javascript?

var json = { 
    "Lofts": "none", 
    "Maisons": "2", 
    "HOMES": [{ 
     "home_id": "1", 
     "price": "925", 
     "num_of_beds": "2" 
    }, { 
     "home_id": "2", 
     "price": "1425", 
     "num_of_beds": "4", 
    }, { 
     "home_id": "3", 
     "price": "333", 
     "num_of_beds": "5", 
    }] 
}; 

Làm thế nào tôi có thể lọc đối tượng này và vẫn với HOMES tài sản nơi home_id = 2?

Kết quả:

var json = { 
    "Lofts": "none", 
    "Maisons": "2", 
    "HOMES": [{ 
     "home_id": "2", 
     "price": "1425", 
     "num_of_beds": "4", 
    }] 
}; 

Có cách nào tôi có thể chu kỳ đối tượng và mantein tất cả các thuộc tính (còn gác xép và maisons)?

Cảm ơn

+0

Sản phẩm bất động sản 'home_id' một giá trị duy nhất cho tất cả các đối tượng của 'json.HOMES' mảng? –

Trả lời

15

Bạn có thể sử dụng Array#filter và gán kết quả trực tiếp đến tài sản HOMES.

var json = { "Lofts": "none", "Maisons": "2", "HOMES": [{ "home_id": "1", "price": "925", "num_of_beds": "2" }, { "home_id": "2", "price": "1425", "num_of_beds": "4", }, { "home_id": "3", "price": "333", "num_of_beds": "5", }] }; 
 

 
json.HOMES = json.HOMES.filter(function (a) { 
 
    return a.home_id === '2'; 
 
}); 
 

 
document.write('<pre>' + JSON.stringify(json, 0, 4) + '</pre>');

+0

Điều này là hữu ích, tuy nhiên tôi đang ở trong một tình huống mà tôi cần phải lọc theo một danh sách các thuộc tính, được lưu trữ trong một mảng? Chính xác hơn, làm thế nào tôi có thể sửa đổi ở trên nếu tôi muốn tất cả các ngôi nhà có id [1,2]? Tôi đã thử 'return a.home_id = ['1', '2'];' nhưng nó không hoạt động như mong đợi. – sc28

+1

@ sc28, sau đó bạn cần sử dụng 'indexOf' với so sánh, như' return ['1', '2']. IndexOf (a.home_id)! == -1; 'hoặc để kiểm tra với' bao gồm' , như 'return ['1', '2']. bao gồm (a.home_id);'. –

5

Với việc sử dụng thư viện tiện ích Lodash, bạn có thể sử dụng phương pháp find nếu home_id là duy nhất.

Tìm: Lặp lại các thành phần của collection (Array | Object), trả về phần tử đầu tiên predicate trả về giá trị thực. Vị từ được gọi với ba đối số: (value, index | key, collection).

_.find(collection, [predicate=_.identity]) 

Code:

var json = {"Lofts": "none","Maisons": "2","HOMES": [{"home_id": "1","price": "925","num_of_beds": "2"}, {"home_id": "2","price": "1425","num_of_beds": "4"}, {"home_id": "3","price": "333","num_of_beds": "5"}]}; 
 
json.HOMES = [_.find(json.HOMES, {home_id: '2'})]; 
 

 
document.write('<pre>' + JSON.stringify(json, 0, 4) + '</pre>');
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.12.0/lodash.min.js"></script>

Nếu có nhiều đối tượng với cùng home_id bạn nên thực hiện một filter:

_.filter(collection, [predicate=_.identity])

Bộ lọc: Lặp lại trên các thành phần của collection (Mảng | Đối tượng), trả về một mảng của tất cả các thuộc tính của các phần tử trả về độ trung thực cho. Vị từ được gọi với ba đối số: (value, index | key, collection).

Code:

var json = {"Lofts": "none","Maisons": "2","HOMES": [{"home_id": "1","price": "925","num_of_beds": "2"}, {"home_id": "2","price": "1425","num_of_beds": "4"}, {"home_id": "3","price": "333","num_of_beds": "5"}]}; 
 
json.HOMES = _.filter(json.HOMES, {home_id: '2'}); 
 

 
document.write('<pre>' + JSON.stringify(json, 0, 4) + '</pre>');
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.12.0/lodash.min.js"></script>

+0

Bạn thực sự nên sử dụng một bộ lọc, không phải là một tìm kiếm, bởi vì OP đã chỉ định một mệnh đề 'where' (do đó theo định nghĩa có thể có nhiều hơn một kết hợp). Ngoài ra, có nhiều đối sánh đơn giản hơn, cả trong lodash và dấu gạch dưới: '_.where (json.HOMES, {home_id:" 2 "}' (http://underscorejs.org/#findWhere) hoặc '_.filter (json.HOMES, {home_id: "2"} '(https://lodash.com/docs#filter). – rewritten

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