[英]Searching JSON deeply nested Objects with dynamic keys using Lodash?
我有一个嵌套的JSON,我想使用lodash进行搜索。 如果我要查找的搜索词在某些键中并且其中一个键是动态的,如何从data
获取根对象?
例如,如果我有:
"data": [
{
"name": "Bob's concourse"
"activities": [
{
"day": "Monday",
"routines":
{
"Biking":
{
"details": "won 3 trophies"
"type": "road"
},
"Kayaking":
{
"details": "participated in 3 races"
"type": "rhythm"
}
}
}
}
]
},
{..other_data_etc...},
]
activities
可以是[]
; 不能保证它包含任何数据。 routines
键是动态的。 即Biking
, Kayaking
是动态字符串。 可以是任何东西。 如果我要搜索races
(不区分大小写),我想专门搜索:
data.name
data.activities.routines.*
(动态键) data.activities.routines.*.details
如果其中任何一个匹配,则它将返回根对象: { "name": "Bob", ..... }
我能够得到返回的name
:
function searchText(collection, searchterm) {
return _.filter(collection, function(o) {
return _.includes(o.name.toLowerCase(), searchterm)
} );
};
但是我对lodash还是很陌生,而且我无法使任何嵌套搜索正确返回,尤其是在动态键部分。
谁能帮助解释解决方案?
使用lodash扩展您现有的尝试:
const obj = { data: [{ name: 'Bob\\'s concourse', activities: [{ day: 'Monday', routines: { Biking: { details: 'won 3 trophies', type: 'road' }, Kayaking: { details: 'participated in 3 races', type: 'rhythm' } } }] }] }; function search(str, data) { const searchStr = str.toLowerCase(); // Only return the entries that contain a matched value return _.filter(data, (datum) => { // Check if name matches return _.includes(datum.name, searchStr) || _.some(datum.activities, (activity) => { return _.entries(activity.routines).some(([routine, {details}]) => { // Check if dynamic routine matches or details return _.includes(routine, searchStr) || _.includes(details, searchStr); }); }); }); } console.log(search('foobar', obj.data)); console.log(search('races', obj.data));
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.10/lodash.min.js"></script>
您也可以使用纯JavaScript完成此操作。 使用一些新的语法(例如, 销毁分配)和新的本机方法(例如, Object.entries
基本上遵循与使用lodash相同的模式:
const obj = { data: [{ name: 'Bob\\'s concourse', activities: [{ day: 'Monday', routines: { Biking: { details: 'won 3 trophies', type: 'road' }, Kayaking: { details: 'participated in 3 races', type: 'rhythm' } } }] }] }; function search(str, data) { const regex = RegExp(str, 'i'); // Only return the entries that contain a matched value return data.filter((datum) => { // Check if name matches return regex.test(datum.name) || datum.activities.some((activity) => { return Object.entries(activity.routines).some(([routine, {details}]) => { // Check if dynamic routine matches or details return regex.test(routine) || regex.test(details); }); }); }); } console.log(search('foobar', obj.data)); console.log(search('races', obj.data));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.