Reputation: 872
I have an array of object, in which each object has an inner array of the object which in turn has again an inner array of objects, it can go to any level of the inner object which I want to filter and display.
obj = [{ name: "apple", subGroups: [{ name: "apple-a", subGroups: { name: "apple-b", subGroups: [{ name: "apple-c", subGroups: { name: "apple-d", subGroups:[]}}]}}]}
{ name: "orange", subGroups: [{ name: "orange-a", subGroups: { name: "orange-b", subGroups: [{ name: "orange-c", subGroups: { name: "orange-d", subGroups:[]}}]}}]}
{ name: "mango", subGroups: [{ name: "123", subGroups: []}]}
{ name: "grapes", subGroups: [{ name: "123", subGroups: []}]}
{ name: "pear", subGroups: [{ name: "123", subGroups: []}]}]
searchvalue is dynamic 'orange-d' ,
searchvalue = 'orange-d';
result = { name: "orange-d", subGroups:[]}
const newArr = obj.map(obj => {
return obj.name === searchvalue;
}).flat();
I have tried with filter, map, flat but I was not able to find the output, pls help
Upvotes: 3
Views: 76
Reputation: 1382
side note: it would probably be better if you will reconsider that recursive structure. for the solution you should use some kind of recursion like so:
var obj = [
{ name: "apple", subGroups: [
{ name: "apple-a", subGroups: [
{ name: "apple-b", subGroups: [
{ name: "apple-c", subGroups: [
{ name: "apple-d", subGroups:[]}
]}
]}
]}
]},
{ name: "orange", subGroups: [
{ name: "orange-a", subGroups: [
{ name: "orange-b", subGroups: [
{ name: "orange-c", subGroups: [
{ name: "orange-d", subGroups:[]}
]}
]}
]}
]},
{ name: "mango", subGroups: [
{ name: "123", subGroups: []}
]},
{ name: "grapes", subGroups: [
{ name: "123", subGroups: []}
]},
{ name: "pear", subGroups: [
{ name: "123", subGroups: []}
]}
];
var searchvalue = 'orange-d';
function findName(array, name) {
let result = {};
if(!(Array.isArray(array) && array.length))
return result;
for(let item of array) {
if(item.name === name) return item;
result = findName(item.subGroups, name);
if (result && result.name === name) return result;
}
return result;
}
console.log(findName(obj, searchvalue));
Upvotes: 3
Reputation: 386836
You could take Array#flatMap
with a previous check for the handed over array or object, as if follows later as subGroups
.
const
find = (array, name) => (Array.isArray(array) ? array : [array])
.flatMap(o => o.name === name ? o : find(o.subGroups, name)),
data = [{ name: "apple", subGroups: [{ name: "apple-a", subGroups: { name: "apple-b", subGroups: [{ name: "apple-c", subGroups: { name: "apple-d", subGroups: [] } }] } }] }, { name: "orange", subGroups: [{ name: "orange-a", subGroups: { name: "orange-b", subGroups: [{ name: "orange-c", subGroups: { name: "orange-d", subGroups: [] } }] } }] }, { name: "mango", subGroups: [{ name: "123", subGroups: [] }] }, { name: "grapes", subGroups: [{ name: "123", subGroups: [] }] }, { name: "pear", subGroups: [{ name: "123", subGroups: [] }] }],
result = find(data, 'orange-d');
console.log(result);
Upvotes: 4