javascript - 如果在子对象中找到值,则搜索嵌套对象数组并返回父对象[重复]

Posted

技术标签:

【中文标题】javascript - 如果在子对象中找到值,则搜索嵌套对象数组并返回父对象[重复]【英文标题】:javascript - search array of nested objects and return parent if value is found in child [duplicate] 【发布时间】:2017-11-16 22:34:07 【问题描述】:

有一个对象数组(489 个对象)。一个对象有一个键,该键具有另一个对象(子对象)。子对象的数量是不确定的。

我也创建了a fiddle。请找到以下搜索功能:

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;
 

在这里,我想在对象数组中搜索搜索字符串,包括嵌套对象 (asset_info)。没有getObjects 的搜索可以在下面的函数中正常工作。

    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;

在上述函数中,我无法在嵌套对象 (asset_info) 中进行搜索。所以我一直在使用我在网上找到的getObject函数。

现在的问题是我无法搜索包括asset_info,但无法返回其父级。例如在小提琴中,如果我搜索 emc,搜索应该从 data 返回第二个对象。

更新: still not able to return parent of a child where search string has been found

** 更新 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'
];

如果我在这里搜索字符串“emc”,它应该返回 2 个对象。第一个对象只有一个孩子,因为只有一个对象的“制造商”为“emc”。

输出应该是:

[

  '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'
];

如果在子对象中找到搜索字符串,如何在包含嵌套对象的对象数组中搜索字符串并返回父对象?

【问题讨论】:

***.com/questions/15523514/… @SimonPertersen 我尝试了您建议的解决方案。但我无法返回已找到搜索字符串的子对象的父对象。你能看看这个jsfiddle.net/7eL7t0d1/6 【参考方案1】:

您可以使用迭代和递归方法,如果子项与搜索值匹配,则返回检查结果并构建新对象和数组。

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; 

【讨论】:

太好了。它工作正常。多谢。如何返回只有具有搜索字符串的孩子/孩子的父母?我的意思是即使只在一个孩子中找到搜索字符串也不返回所有孩子。 你的意思是父对象吗? 是父级,只有找到搜索字符串的子级。 例如,如果搜索字符串在 20 个子项中的 2 个子项中找到,则该函数应返回仅包含 2 个子项的父项。目前它正在返回所有 20 个孩子的父母。 我已经更新了 fiddle jsfiddle.net/7eL7t0d1/7 中的数据。如果我搜索字符串“emc”,函数应该返回 2 个对象。第一个对象应该只有一个制造商是 emc 的孩子。

以上是关于javascript - 如果在子对象中找到值,则搜索嵌套对象数组并返回父对象[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如果未找到值,则使用 mongoose 将对象添加到数组中,否则更新字段

如果对象存在于全局中,则R从函数中从全局环境中获取对象,但如果不存在则使用不同的默认值

JavaScript

在子数组猫鼬中找到只有匹配对象的对象数组?

如果在子级上验证失败,则不会在父级上调用IValidatableObject.Validate

NumPy:在子矩阵/块和相应的行、列索引中找到最小值