Home > database >  search an item in multidimentionnal array
search an item in multidimentionnal array

Time:04-09

I'm trying to find an element on a multidimentionnal array usin JAVASCRIPT function, but I get error

This is my array's data:

export const datas = [
    {
        id: 1,
        firstName: 'John',
        tables: [
            { ID: 11, title: 'Lorem' },
            { ID: 12, title: 'Ipsum' },
        ],
    },
    {
        id: 2,
        firstName: 'Doe',
        tables: [
            {
                ID: 22,
                title: 'Arke',
                nodes: [{ name: 'Name1' }, { name: 'Name2' }, { name: 'Name3' }],
            },
            { ID: 23, title: 'Korem' },
        ],
    },
    {
        id: 3,
        firstName: 'Brad',
        tables: [
            {
                ID: 30,
                title: 'Mern',
                nodes: [{ name: 'Name4' }, { name: 'Name5' }, { name: 'Name6' }],
            },
            {
                ID: 31,
                title: 'Full',
                nodes: [{ name: 'Name7' }, { name: 'Name8' }, { name: 'Name9' }],
            },
        ],
    },
];

I've tried a reccursive function but it's not work, this is my code :

export const findById = (arr, id) => {
    for (let o of arr) {
        if (o.tables.length > 0) {
            let a = findById(o.tables.nodes, 'id');
            console.log(a);
        }
    }
};

I want to print the Object with ID 22, the problem is that I don't have the same structure in each dimension, and it still confuse me..

My Input : 22

My output :

{
    ID: 22,
    title: 'Arke',
    nodes: [{ name: 'Name1' }, { name: 'Name2' }, { name: 'Name3' }],
},

Have you an idea how to edit my function to get my input's response ?

CodePudding user response:

Your recursive function wasn't too far off, you need to check if the item as a tables first before recursively calling it again. And then finally just check the ID in the loop.

eg..

const datas=[{id:1,firstName:"John",tables:[{ID:11,title:"Lorem"},{ID:12,title:"Ipsum"}]},{id:2,firstName:"Doe",tables:[{ID:22,title:"Arke",nodes:[{name:"Name1"},{name:"Name2"},{name:"Name3"}]},{ID:23,title:"Korem"}]},{id:3,firstName:"Brad",tables:[{ID:30,title:"Mern",nodes:[{name:"Name4"},{name:"Name5"},{name:"Name6"}]},{ID:31,title:"Full",nodes:[{name:"Name7"},{name:"Name8"},{name:"Name9"}]}]}];


function findById(arr, ID) {
  for (const a of arr) {
    if (a.tables) {
      const r = findById(a.tables, ID);
      if (r) return r;
    }
    if (a.ID === ID) return a;
  }
}

console.log(findById(datas, 22));

CodePudding user response:

if you just need the nested data you can use flatMap and find

const findById = (arr, id) =>
  arr
  .flatMap(d => d.tables)
  .find(t => t.ID === id)



const datas = [{
    id: 1,
    firstName: 'John',
    tables: [{
        ID: 11,
        title: 'Lorem'
      },
      {
        ID: 12,
        title: 'Ipsum'
      },
    ],
  },
  {
    id: 2,
    firstName: 'Doe',
    tables: [{
        ID: 22,
        title: 'Arke',
        nodes: [{
          name: 'Name1'
        }, {
          name: 'Name2'
        }, {
          name: 'Name3'
        }],
      },
      {
        ID: 23,
        title: 'Korem'
      },
    ],
  },
  {
    id: 3,
    firstName: 'Brad',
    tables: [{
        ID: 30,
        title: 'Mern',
        nodes: [{
          name: 'Name4'
        }, {
          name: 'Name5'
        }, {
          name: 'Name6'
        }],
      },
      {
        ID: 31,
        title: 'Full',
        nodes: [{
          name: 'Name7'
        }, {
          name: 'Name8'
        }, {
          name: 'Name9'
        }],
      },
    ],
  },
];

console.log(findById(datas, 22))

CodePudding user response:

js has amazing array options https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array

the ones which will help you most are probably:

here are some examples

// get the base with id 22
const baseWith22ID = datas.filter(f => f.tables.filter(s => s.id = 22))
// (i guess you want this one) get all elements with id 22
const onlyElementsWith22ID = datas.flatMap(f => f.tables.filter(s => s.id = 22))
  • Related