javascript - 搜索嵌套对象的数组,如果在child中找到值,则返回parent [英] javascript - search array of nested objects and return parent if value is found in child

查看:70
本文介绍了javascript - 搜索嵌套对象的数组,如果在child中找到值,则返回parent的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有一个对象数组(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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆