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从函数中从全局环境中获取对象,但如果不存在则使用不同的默认值