2016-05-15 109 views
17

我有以下的JSON對象:如何使用JavaScript過濾複雜的json對象?

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", 
    }] 
}; 

如何過濾此對象,並保持與家物產其中HOME_ID = 2?

結果:

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

有沒有什麼辦法可以循環對象和mantein所有屬性(也閣樓和MAISONS)?

感謝

+0

是屬性'home_id'爲'json.HOMES'陣列的所有對象的唯一值? –

回答

15

您可以使用Array#filter,並將結果直接分配給屬性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

這很有幫助,但是我處於需要根據存儲在數組中的屬性列表進行過濾的情況?更確切地說,如果我想要所有ID爲[1,2]的家庭,我將如何修改上述內容?我試過'返回a.home_id = ['1','2'];'但它不能按預期工作。 – sc28

+1

@sc28,那麼你需要使用'indexOf'進行比較,比如'return ['1','2']。indexOf(a.home_id)!== -1;'或者檢查'includes' ,如'return ['1','2']。includes(a.home_id);'。 –

5

通過使用工具庫Lodash,你可以使用的方法find如果home_id是獨一無二的。

查找:迭代過的collection(陣列|對象)元素,它返回第一元件predicate返回truthy對。謂詞用三個參數調用:(value,index | key,collection)。

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

代碼:

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>

如果有多個對象具有相同home_id你應該做一個filter

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

Filter:遍歷collection(Array | Object)的元素,返回所有元素謂詞的數組返回truthy。謂詞用三個參數調用:(value,index | key,collection)。

代碼:

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

你實際上應該使用一個過濾器,而不是一個查找,因爲OP確實指定了一個'where'子句(所以根據定義可能有多個匹配)。此外,還有更簡單的匹配器,無論是lodash還是下劃線:'_.where(json.HOMES,{home_id:「2」}'(http://underscorejs.org/#findWhere)或'_。過濾器(json.HOMES,{home_id:「2」}(https://lodash.com/docs#filter)。 – rewritten