这是来自my previous question的后续问题。从我收到的答案中,我能够在一个对象数组中的嵌套对象中进行搜索。
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'作为'制造商'是在儿童对象中。并且每个子对象都不满足这种条件。我正在寻找的结果,例如'emc',它应该返回2个父对象。第一个父对象应该只有一个孩子(另一个孩子的'hp'作为制造商)。第二个父对象应该有一个子节点,因为它匹配搜索字符串。
我尝试使用搜索结果创建一个新对象但无法使其正常工作。
如何仅使用满足给定搜索字符串的子项返回父对象?
这是chatlog on my previous question,可以帮助理解问题和要求。
答案 0 :(得分: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; }

答案 1 :(得分:1)
我不确定你的方法有多深,但这应该可以解决问题
当子项具有每行时,它将复制每一行,并仅使用匹配值替换该集
function filterSet(dataSet, matchFn) {
return dataSet.reduce((current, row) => {
if (typeof row === 'object') {
for (let prop in row) {
if (Array.isArray(row[prop])) {
var set = filterSet(row[prop], matchFn);
if (set && set.length > 0) {
// copy the row, replace the array property with the results
current.push( Object.assign({}, row,
{ [prop]: set }
) );
// since the full row is now in there
// no need to check more
break;
}
} else if (matchFn(row[prop])) {
// copy not ref
current.push( Object.assign( {}, row ) );
break;
}
}
}
return current;
}, []);
}
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'
}
];
console.log(filterSet(data, (i) => {
return i.toString().toLowerCase().indexOf('emc') >= 0;
}));
console.log(filterSet(data, (i) => {
return i.toString().toLowerCase().indexOf('invalid') >= 0;
}));