2017-06-14 11 views
2

有一個對象數組(489個對象)。一個對象有一個鍵有另一個對象(子對象)。子對象的數量是不確定的。我也創建了a fiddle。請在下面找到搜索功能:javascript - 搜索嵌套對象數組,如果在子代中找到值,則返回父級數

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',它應該返回兩個對象。第一個對象將只有一個孩子,因爲只有一個對象的'製造商'爲'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' 
}]; 

如何搜索字符串對象,包括嵌套的對象,如果搜索字符串的子對象發現返回父對象的數組內?

+0

https://stackoverflow.com/questions/15523514/find-by-key-deep-in-a-nested-object –

+0

@SimonPertersen我試着用你建議的解決方案。但是我無法返回找到搜索字符串的子對象的父對象。你可以看看這個https://jsfiddle.net/7eL7t0d1/6/ – Valay

回答

2

您可以使用迭代和遞歸方法,並返回檢查的結果並在孩子匹配搜索值時構建新的對象和數組。

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; }

+0

,這很好。它工作正常。非常感謝。我怎樣才能返回父母只有兒童/兒童有搜索字符串?我的意思是即使搜索字符串只在一個孩子中找到,也不會返回所有孩子。 – Valay

+1

你的意思是父對象? –

+0

是隻有具有搜索字符串的子代的父代。 – Valay

相關問題