I have data that is structured like the following:
const arr = [{
id: 0,
name: 'Biomes',
icon: 'mdi-image-filter-hdr',
isParent: true,
children: [{
id: 1,
name: 'Redwood forest',
icon: 'mdi-image-filter-hdr'
}]
},{
id: 2,
name: 'Trees',
icon: 'mdi-pine-tree',
children: [{
id: 8,
name: 'Redwood',
icon: 'mdi-pine-tree'
}]
}];
The top level is an array of objects, and each object can have a child field children which itself can be an array of objects. If I know the value of id, how can I find the object (or more importantly the object name), based on that id value?
CodePudding user response:
You can use recursion here to get the object no matter how deep it is.
function getObjectFromId(arr, id) {
for (let i = 0; i < arr.length; i) {
if (arr[i].id === id) return arr[i];
if (arr[i].children) {
const result = getObjectFromId(arr[i].children, id);
if (result) return result;
}
}
}
const arr = [
{
id: 0,
name: "Biomes",
icon: "mdi-image-filter-hdr",
isParent: true,
children: [
{
id: 1,
name: "Redwood forest",
icon: "mdi-image-filter-hdr",
},
],
},
{
id: 2,
name: "Trees",
icon: "mdi-pine-tree",
children: [
{
id: 8,
name: "Redwood",
icon: "mdi-pine-tree",
},
],
},
];
function getObjectFromId(arr, id) {
for (let i = 0; i < arr.length; i) {
if (arr[i].id === id) return arr[i];
if (arr[i].children) {
const result = getObjectFromId(arr[i].children, id);
if (result) return result;
}
}
}
console.log(getObjectFromId(arr, 1));
console.log(getObjectFromId(arr, 8));
CodePudding user response:
first arg for child
second arg for main
const arr = [
{id: 0,name: 'Biomes',icon: 'mdi-image-filter-hdr',isParent: true,
children: [{id: 1,name: 'Redwood forest',icon: 'mdi-image-filter-hdr',},],},
{id: 2,name: 'Trees',icon: 'mdi-pine-tree',
children: [{id: 8,name: 'Redwood',icon: 'mdi-pine-tree',},],},
];
const getChildById = (_id, _id2 = false)=>{
for(const main of arr){
if(_id2 !== false && main.id !== _id2)continue;
for(const child of main.children){
if(child.id === _id)return child;
}
}
return false;
};
(async()=>{
const i_want_this_id = 8;
//
const a = getChildById(i_want_this_id);
console.log('Found', a);
})();
CodePudding user response:
Solution 1: 2 for loop.
const inputArray = [{
id: 0,
name: 'Biomes',
icon: 'mdi-image-filter-hdr',
isParent: true,
children: [{
id: 1,
name: "Redwood forest",
icon: 'mdi-image-filter-hdr'
}]
},
{
id: 2,
name: 'Trees',
icon: 'mdi-pine-tree',
children: [{
id: 8,
name: "Redwood",
icon: 'mdi-pine-tree',
}]
}
];
console.log(findById(8));
function findById(id) {
for (const parent of inputArray) {
if (parent.id === id)
return parent;
for (const child of parent.children)
if (child.id === id)
return child;
}
return null;
}
Solution 2: multiple nested level:
const inputArray = [{
id: 0,
name: 'Biomes',
icon: 'mdi-image-filter-hdr',
isParent: true,
children: [{
id: 1,
name: "Redwood forest",
icon: 'mdi-image-filter-hdr'
}]
},
{
id: 2,
name: 'Trees',
icon: 'mdi-pine-tree',
children: [{
id: 8,
name: "Redwood",
icon: 'mdi-pine-tree',
children: [{
id: 12,
name: "Test Level 2",
icon: 'mdi-pine-tree',
children: [{
id: 13,
name: "Test Level 3",
icon: 'mdi-pine-tree',
}]
}]
}]
}
];
console.log(findById(13, inputArray));
function findById(id, array) {
for (const parent of array) {
if (parent.id === id)
return parent;
if ('children' in parent) {
const result = findById(id, parent.children);
if (result) return result;
}
}
return null;
}
CodePudding user response:
Is this what you are looking for ?
let object= arr.find((item)=>item.id === "your ID");
console.log(object?.name);
CodePudding user response:
const arr = [{
id: 0,
name: 'Biomes',
icon: 'mdi-image-filter-hdr',
isParent: true,
children: [{
id: 1,
name: 'Redwood forest',
icon: 'mdi-image-filter-hdr'
}]
},{
id: 2,
name: 'Trees',
icon: 'mdi-pine-tree',
children: [{
id: 0,
name: 'whatever',
icon: 'new-tree'
},{
id: 8,
name: 'Redwood',
icon: 'mdi-pine-tree'
}]
}];
const findById = (id) => arr
.filter(x => x.id === id || x.children.some(child => id === child.id))
.map(y => ({...y, children: y.children.filter(child => id === child.id)}))
console.log(findById(0))
You can first filter out all parents who has the same id or if the parent has child with same id via some, which then using map to and filter to remove all children who don't have the id
CodePudding user response:
This how you can achieve
function findChildrenById(data, cid) {
for (let p = 0; p < data.length; p = 1) {
if (data[p].id === cid) return data[p].name
let res = data[p].children.find(c => c.id === cid)
if (res) return res.name
}
return null
}
const arr = [{
id: 0,
name: 'Biomes',
icon: 'mdi-image-filter-hdr',
isParent: true,
children: [{
id: 1,
name: 'Redwood forest',
icon: 'mdi-image-filter-hdr'
}]
}, {
id: 2,
name: 'Trees',
icon: 'mdi-pine-tree',
children: [{
id: 8,
name: 'Redwood',
icon: 'mdi-pine-tree'
}]
}];
console.log(findChildrenById(arr, 2))
CodePudding user response:
To find at parent and child level
const arr=[{id:0,name:'Biomes',icon:'mdi-image-filter-hdr',isParent:!0,children:[{id:1,name:"Redwood forest",icon:'mdi-image-filter-hdr'}]},{id:2,name:'Trees',icon:'mdi-pine-tree',children:[{id:8,name:"Redwood",icon:'mdi-pine-tree',}]}]
const res = arr.reduce((a,item)=>{
const { children, ...i} = item;
a.push(...children, i);
return a;
},[]);
function findInData(id){
return res.find(o=>o.id===id);
}
console.log(findInData(8)?.name);
console.log(findInData(2)?.name);
