I have an array of objects like the one below and I'm looking to get the parent (Dashboard) and the name of its child when searching for 'Summary'
[
{
Dashboard1: [
{name: 'Summary'},
{name: 'SomeThingElse'},
{name: 'SomeThingElse2'}
]
},
{
Dashboard2: [
{name: 'Summary'},
{name: 'Different'},
{name: 'Different2'}
]
},
{
Dashboard3: [
{name: 'Summary'},
{name: 'AnotherDifferent'},
{name: 'AnotherDifferent2'}
]
},
{
Dashboard4: [
{name: 'AnotherDifferent'},
{name: 'AnotherDifferent2'}
{name: 'AnotherDifferent3'},
{name: 'AnotherDifferent4'},
]
}
]
I have an input that searches for 'Summary' and I want it to return just
[
{
Dashboard1: [
{name: 'Summary'},
]
},
{
Dashboard2: [
{name: 'Summary'},
]
},
{
Dashboard2: [
{name: 'Summary'},
]
}
]
I have this function that filters Dashboard4 where Summary is not present as a child but returns all children as well.
function filterByValue(array, value) {
return array.filter((data) => JSON.stringify(data).toLowerCase().indexOf(value.toLowerCase()) !== -1);
}
Thanks!
const a = [
{
Dashboard1: [
{name: 'Summary'},
{name: 'SomeThingElse'},
{name: 'SomeThingElse2'}
]
},
{
Dashboard2: [
{name: 'Summary'},
{name: 'Different'},
{name: 'Different2'}
]
},
{
Dashboard3: [
{name: 'Summary'},
{name: 'AnotherDifferent'},
{name: 'AnotherDifferent2'}
]
},
{
Dashboard4: [
{name: 'AnotherDifferent'},
{name: 'AnotherDifferent2'},
{name: 'AnotherDifferent3'},
{name: 'AnotherDifferent4'},
]
}
];
function filterByValue(array, value) {
const result = [];
array.forEach(e => {
const keys = Object.keys(e);
const obj = {};
keys.forEach(k => {
const matches = e[k].filter(i => i.name === value);
if (matches.length > 0) {
obj[k] = matches;
}
});
if (Object.keys(obj).length > 0) {
result.push(obj);
}
});
return result;
}
console.log(filterByValue(a, 'Summary'));
This is a reusable function for a similar scenario.
const searchNestedArraySearch = (val, arr, key, childKey) => {
const newArr = arr.map((e, i) => {
//Get the propert need from nested object via the key and appending the index
let firstChildObj = e[`${key}${i + 1}`];
console.log(firstChildObj);
// loop through the nested property array
const checkProperty = firstChildObj.map((e) => {
const valueProp = e[childKey] === val ? true : false;
if (valueProp) {
return { [childKey]: val };
} else {
return null;
}
});
// remove null value from each array to get specified search
const filterEmpty = checkProperty.filter((val) => val !== null);
// return array of property containing search value
if (filterEmpty.length) {
return { [`${key}${i + 1}`]: filterEmpty };
}
});
return newArr.filter((e) => e !== undefined); };
console.log(searchNestedArray("Summary", data, "Dashboard", "name"));
/**
Given the array, you can use a more coincise function like that:
const array = [
{
Dashboard1: [
{name: 'Summary'},
{name: 'SomeThingElse'},
{name: 'SomeThingElse2'}
]
},
{
Dashboard2: [
{name: 'Summary'},
{name: 'Different'},
{name: 'Different2'}
]
},
{
Dashboard3: [
{name: 'Summary'},
{name: 'AnotherDifferent'},
{name: 'AnotherDifferent2'}
]
},
{
Dashboard4: [
{name: 'AnotherDifferent'},
{name: 'AnotherDifferent2'},
{name: 'AnotherDifferent3'},
{name: 'AnotherDifferent4'},
]
}]
const filterByValue = (array, value) => array.filter(el => {
const objValues = Object.values(el).flat()
const elementsValues = objValues.map(v => Object.values(v)).flat()
return elementsValues.some(v => v.includes(value))
})
console.log(filterByValue(array, 'Summary'));