javascript - 搜索嵌套对象的数组,如果在child中找到值,则返回parent [英] javascript - search array of nested objects and return parent if value is found in child
问题描述
有一个对象数组(489个对象)。对象具有一个具有另一个对象(子对象)的键。子对象的数量是不确定的。
我也创建了小提琴 。请在下面找到搜索功能:
function getObjects(obj,key,val){
var objects = [];
for(var i in obj){
if(!obj.hasOwnProperty(i))continue;
if(typeof obj [i] =='object'){
parent = obj;
objects = objects.concat(getObjects(obj [i],key,val));
} else {
if(obj [i] .toString()。toLowerCase()。indexOf(val.toString()。toLowerCase())> -1){
objects。推(OBJ);
}
}
}
返回对象;
}
这里我想在包含嵌套的对象数组中搜索搜索字符串对象( asset_info
)也是如此。没有 getObjects
的搜索可以正常使用以下函数。
this.data .filter(函数(行){
var flag;
for(var prop in(columns.length> 0?columns:row)){
flag = false;
flag = row [columns.length> 0?columns [prop]:
prop] .toString()。toLowerCase()。indexOf(searchString.toString()。toLowerCase())> -1;
if(flag)
break;
}
return flag;
在上面的函数中,我无法在嵌套对象中搜索( asset_info
)。所以我一直在使用 getObject
我在网上找到的功能。
现在问题是我无法搜索包括 asset_info
但不是能够返回其父级。例如,在小提琴中,如果我搜索 emc
,搜索应该从数据返回第二个对象
。
**更新2 **
var data = [
{
'review_name':'gtec / 1101822 / lmikdy / ls-rmea / oss11',
'res asset_count':2,
'pdg':'无效',
'user_area ':'无效',
'part署_number':'无效',
'spoc':'无效',
'发布':'无效',
'start_date': '2017-06-12 00:00:00',
'end_date':'2017-06-16 00:00:00',
'res asset_info':[
{
'bams_id':'BAMS-1001423507',
'主机名':'GTVOSS11',
'状态':10,
'site_location':'IEAT01 Tipperary',
'stack_number':'VIRTUAL RACK',
'carck_u_position':0,
'制造商':'EMC',
'型号':'VM',
},
{
'bams_id':'BAMS-1001368001',
'主机名':'无',
'状态':10 ,
'site_location':'IEAT01 Tipperary',
'stack_number':'VIRTUAL RACK',
'carck_u_position':0,
'制造商':'HP',
'mode':'HP BL460C GEN8',
}
],
'full_name':'无效(无效)',
'mail_address' :'无效'
},
{
'review_name':'gtec / 1101822 / lmikdy / ls-rmea / oss11',
'res asset_count':2,
'pdg':'无效',
'user_area':'无效',
'part署_number':'无效',
'spoc':'无效',
'发布':'无效',
'start_date':'2017-06-12 00:00:00',
'end_date':'2017-06-16 00:00:00',
'res asset_info':[
{
'bams_id':'BAMS-1001423507',
'hostna我':'GTVOSS11',
'状态':10,
'site_location':'IEAT01 Tipperary',
'stack_number':'VIRTUAL RACK',
'carck_u_position' :0,
'制造商':'EMC',
'型号':'VM',
}
],
'full_name': '无效(无效)',
'mail_address':'无效'
}];
如果我搜索字符串'emc',它应返回2个对象。第一个对象只有一个孩子,因为只有一个对象的'制造商'为'emc'。
输出应为:
[
{
'review_name':'gtec / 1101822 / lmikdy / ls-rmea / oss11' ,
'res asset_count':2,
'pdg':'无效',
'user_area':'无效',
'part署_number':'无效',
'spoc':'无效',
'释放':'无效',
'start_date':'2017-06-12 00:00:00',
'end_date': '2017-06-16 00:00:00',
'asset_info':[
{
'bams_id':'BAMS-1001423507',
'hostname':' GTVOSS11',
'状态':10,
'site_location':'IEAT01 Tipperary',
'stack_number':'VIRTUAL RACK',
'carck_u_position':0,
'制造商':'EMC',
'型号':'VM',
}
],
'full_n ame':'无效(无效)',
'mail_address':'无效'
},
{
'review_name':'gtec / 1101822 / lmikdy / ls-rmea / oss11',
'res asset_count':2,
'pdg':'无效',
'user_area':'无效',
'part署_number':'无效',
'spoc':'无效',
'发布':'无效',
'start_date':'2017-06-12 00:00:00',
' end_date':'2017-06-16 00:00:00',
'res asset_info':[
{
'bams_id':'BAMS-1001423507',
'主机名':'GTVOSS11',
'状态':10,
'site_location':'IEAT01 Tipperary',
'stack_number':'VIRTUAL RACK',
'carck_u_position': 0,
'制造商':'EMC',
'型号':'VM',
}
],
'full_name':'无效(无效)',
'mail_address':'无效'
}];
如何在包含嵌套对象和返回父对象的对象数组中搜索字符串对象,如果在子对象中找到搜索字符串?
您可以使用迭代和递归方法并返回如果子项与搜索值匹配,则检查并构建新对象和数组的结果。
function getValue(item){if(Array.isArray(item)){return item.reduce(iterA,undefined); } if(item&& typeof item ==='object'){return iterO(item); } if(typeof item!=='object'&& item.toString()。toLowerCase()。indexOf(search)!== -1){return item; function iterO(o){var temp = Object.keys(o).reduce(function(r,k){var value = getValue(o [k]); if(value){r = r || {} ; r [k] = value;} return r;},undefined); if(temp){Object.keys(o)。forEach(function(k){if(!(k in temp)){temp [k] = o [k];}}); } return temp;} function iterA(r,a){var value = getValue(a); if(value){r = r || []; r.push(值); } return r;} var data = [{booking_name:gtec / 1101822 / lmikdy / ls-rmea / oss11,asset_count:2,pdg:无效,user_area:无效,deployment_number:无效,spoc: 无效,发布:无效,start_date:2017-06-12 00:00:00,end_date:2017-06-16 00:00:00,asset_info:[{bams_id:BAMS-1001423507 ,主机名:GTVOSS11,状态:10,site_location:IEAT01 Tipperary,rack_number:VIRTUAL RACK,rack_u_position:0,制造商:EMC,型号:VM},{bams_id:BAMS-1001368001 ,主机名:无,状态:10,site_location:IEAT01 Tipperary,rack_number:VIRTUAL RACK,rack_u_position:0,制造商:HP,型号:HP BL460C GEN8}],full_name:无效(无效),email_address:无效},{booking_name:gtec / 1101822 / lmikdy / ls-rmea / oss11,asset_count:2,pdg:无效,user_area:无效,deployment_number:无效 ,spoc:invalid,release:Invalid,start_date:2017-06-12 00:00:00,end_date:2017-06-16 00:00:00,asset_info:[{bams_id: BAMS-1001423507 ,主机名:GTVOSS11,状态:10,site_location:IEAT01 Tipperary,rack_number:VIRTUAL RACK,rack_u_position:0,制造商:EMC,型号:VM}],full_name:无效(无效) ),email_address:无效}],search ='emc',result = data.reduce(iterA,undefined); console.log(result);
< pre class =snippet-code-css lang-css prettyprint-override> .as-console-wrapper {max-height:100%!important;顶部:0; }
There is an array of objects (489 objects). An object has a key which has another object (child object). Number of child object is indefinite.
I've created a fiddle as well. Please find below search function:
function getObjects(obj, key, val) {
var objects = [];
for (var i in obj) {
if (!obj.hasOwnProperty(i)) continue;
if (typeof obj[i] == 'object') {
parent = obj;
objects = objects.concat(getObjects(obj[i], key, val));
} else {
if(obj[i].toString().toLowerCase().indexOf(val.toString().toLowerCase()) > -1) {
objects.push(obj);
}
}
}
return objects;
}
Here I want to search for a search string in an array of object including nested object (asset_info
) as well. The search without getObjects
works fine with below function.
this.data.filter(function(row){
var flag;
for(var prop in (columns.length > 0 ? columns : row)){
flag = false;
flag = row[columns.length > 0 ? columns[prop] :
prop].toString().toLowerCase().indexOf(searchString.toString().toLowerCase()) > -1;
if(flag)
break;
}
return flag;
In above function I am not able to search within nested object (asset_info
). And so I have been using getObject
function which I found online.
Now the issue is I am not able to search including asset_info
but not able to return its parent. For example in fiddle, if I search for emc
, search should return 2nd object from data
.
Update: still not able to return parent of a child where search string has been found
** Update 2 **
var data = [
{
'booking_name': 'gtec/1101822/lmikdy/ls-rmea/oss11',
'asset_count': 2,
'pdg': 'Invalid',
'user_area': 'Invalid',
'deployment_number': 'Invalid',
'spoc': 'invalid',
'release': 'Invalid',
'start_date': '2017-06-12 00:00:00',
'end_date': '2017-06-16 00:00:00',
'asset_info': [
{
'bams_id': 'BAMS-1001423507',
'hostname': 'GTVOSS11',
'status': 10,
'site_location': 'IEAT01 Tipperary',
'rack_number': 'VIRTUAL RACK',
'rack_u_position': 0,
'manufacturer': 'EMC',
'model': 'VM',
},
{
'bams_id': 'BAMS-1001368001',
'hostname': 'None',
'status': 10,
'site_location': 'IEAT01 Tipperary',
'rack_number': 'VIRTUAL RACK',
'rack_u_position': 0,
'manufacturer': 'HP',
'model': 'HP BL460C GEN8',
}
],
'full_name': 'Invalid (invalid)',
'email_address': 'Invalid'
},
{
'booking_name': 'gtec/1101822/lmikdy/ls-rmea/oss11',
'asset_count': 2,
'pdg': 'Invalid',
'user_area': 'Invalid',
'deployment_number': 'Invalid',
'spoc': 'invalid',
'release': 'Invalid',
'start_date': '2017-06-12 00:00:00',
'end_date': '2017-06-16 00:00:00',
'asset_info': [
{
'bams_id': 'BAMS-1001423507',
'hostname': 'GTVOSS11',
'status': 10,
'site_location': 'IEAT01 Tipperary',
'rack_number': 'VIRTUAL RACK',
'rack_u_position': 0,
'manufacturer': 'EMC',
'model': 'VM',
}
],
'full_name': 'Invalid (invalid)',
'email_address': 'Invalid'
}];
Here if I search for a string 'emc', it should return 2 objects. 1st object will have only one child as there is only one object has 'manufacturer' as 'emc'.
The output should be:
[
{
'booking_name': 'gtec/1101822/lmikdy/ls-rmea/oss11',
'asset_count': 2,
'pdg': 'Invalid',
'user_area': 'Invalid',
'deployment_number': 'Invalid',
'spoc': 'invalid',
'release': 'Invalid',
'start_date': '2017-06-12 00:00:00',
'end_date': '2017-06-16 00:00:00',
'asset_info': [
{
'bams_id': 'BAMS-1001423507',
'hostname': 'GTVOSS11',
'status': 10,
'site_location': 'IEAT01 Tipperary',
'rack_number': 'VIRTUAL RACK',
'rack_u_position': 0,
'manufacturer': 'EMC',
'model': 'VM',
}
],
'full_name': 'Invalid (invalid)',
'email_address': 'Invalid'
},
{
'booking_name': 'gtec/1101822/lmikdy/ls-rmea/oss11',
'asset_count': 2,
'pdg': 'Invalid',
'user_area': 'Invalid',
'deployment_number': 'Invalid',
'spoc': 'invalid',
'release': 'Invalid',
'start_date': '2017-06-12 00:00:00',
'end_date': '2017-06-16 00:00:00',
'asset_info': [
{
'bams_id': 'BAMS-1001423507',
'hostname': 'GTVOSS11',
'status': 10,
'site_location': 'IEAT01 Tipperary',
'rack_number': 'VIRTUAL RACK',
'rack_u_position': 0,
'manufacturer': 'EMC',
'model': 'VM',
}
],
'full_name': 'Invalid (invalid)',
'email_address': 'Invalid'
}];
How do I search for a string within an array of objects including nested object and return parent object if search string is found in child object ?
You could use an iterative and recursive approach and return the result of the check and build new objects and arrays if the children matches the search value.
function getValue(item) {
if (Array.isArray(item)) {
return item.reduce(iterA, undefined);
}
if (item && typeof item === 'object') {
return iterO(item);
}
if (typeof item !== 'object' && item.toString().toLowerCase().indexOf(search) !== -1) {
return item;
}
}
function iterO(o) {
var temp = Object.keys(o).reduce(function (r, k) {
var value = getValue(o[k]);
if (value) {
r = r || {};
r[k] = value;
}
return r;
}, undefined);
if (temp) {
Object.keys(o).forEach(function (k) {
if (!(k in temp)) {
temp[k] = o[k];
}
});
}
return temp;
}
function iterA(r, a) {
var value = getValue(a);
if (value) {
r = r || [];
r.push(value);
}
return r;
}
var data = [{ booking_name: "gtec/1101822/lmikdy/ls-rmea/oss11", asset_count: 2, pdg: "Invalid", user_area: "Invalid", deployment_number: "Invalid", spoc: "invalid", release: "Invalid", start_date: "2017-06-12 00:00:00", end_date: "2017-06-16 00:00:00", asset_info: [{ bams_id: "BAMS-1001423507", hostname: "GTVOSS11", status: 10, site_location: "IEAT01 Tipperary", rack_number: "VIRTUAL RACK", rack_u_position: 0, manufacturer: "EMC", model: "VM" }, { bams_id: "BAMS-1001368001", hostname: "None", status: 10, site_location: "IEAT01 Tipperary", rack_number: "VIRTUAL RACK", rack_u_position: 0, manufacturer: "HP", model: "HP BL460C GEN8" }], full_name: "Invalid (invalid)", email_address: "Invalid" }, { booking_name: "gtec/1101822/lmikdy/ls-rmea/oss11", asset_count: 2, pdg: "Invalid", user_area: "Invalid", deployment_number: "Invalid", spoc: "invalid", release: "Invalid", start_date: "2017-06-12 00:00:00", end_date: "2017-06-16 00:00:00", asset_info: [{ bams_id: "BAMS-1001423507", hostname: "GTVOSS11", status: 10, site_location: "IEAT01 Tipperary", rack_number: "VIRTUAL RACK", rack_u_position: 0, manufacturer: "EMC", model: "VM" }], full_name: "Invalid (invalid)", email_address: "Invalid" }],
search = 'emc',
result = data.reduce(iterA, undefined);
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
这篇关于javascript - 搜索嵌套对象的数组,如果在child中找到值,则返回parent的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!