0

Hi masters i need to find the best way to convert this:

 [
  { "id": 1, "animal": "cat", "age": 6, "name": "loky" },
  { "id": 2, "animal": "cat", "age": 3, "name": "michu", "parent": 1 },
  { "id": 3, "animal": "cat", "age": 2, "name": "boots", "parent": 1 },
  { "id": 4, "animal": "dog", "age": 9, "name": "bones" },
  { "id": 5, "animal": "dog", "age": 6, "name": "chok", "parent": 4 },
  { "id": 6, "animal": "dog", "age": 6, "name": "cofee","parent": 4 }
]

to this:

 [
  { "id": 1,
    "animal": "cat",
    "age": 6,
    "name": "loky",
    "childs":[ { "id": 2, "animal": "cat", "age": 3, "name": "michu", "parent": 1 },
               { "id": 3, "animal": "cat", "age": 2, "name": "boots", "parent": 1 }] 
  }
  ,
  { "id": 4,
    "animal": "dog",
    "age": 9,
    "name": "bones",
    "childs":[{ "id": 5, "animal": "dog", "age": 6, "name": "chok", "parent": 4 },
              { "id": 6, "animal": "dog", "age": 6, "name": "cofee", "parent": 4 }]
  }
 ]

note that the "parent" key must be used to nest "childs" ,i create my way but with several functions is horrible ,i think there may be a more efficient way.

Thanks in advance sorry for my english

2

2 Answers 2

1
const rows = [
  { id: 1, animal: 'cat', age: 6, name: 'loky' },
  { id: 2, animal: 'cat', age: 3, name: 'michu', parent: 1 },
  { id: 3, animal: 'cat', age: 2, name: 'boots', parent: 1 },
  { id: 4, animal: 'dog', age: 9, name: 'bones' },
  { id: 5, animal: 'dog', age: 6, name: 'chok', parent: 4 },
  { id: 6, animal: 'dog', age: 6, name: 'cofee', parent: 4 },
];

function map(rows) {
  const categories = Array.from(new Set(rows.map((row) => row.animal)));
  return categories.map((c) => {
    const parent = rows.find((row) => row.animal === c);
    parent.childs = rows
      .filter((r) => r.id !== parent.id && r.animal === c)
      .map((r) => ({ ...r, parent: parent.id }));
    return parent;
  });
}

console.log(map(row));

Simply create a mapper function to do.

Sign up to request clarification or add additional context in comments.

4 Comments

Thanks a lot this helpme so much ,with your tips a mede other function working fine, but maybe can make some better? <br> function nester(arr){ parents = rows.filter((row) => row.parent? '' : row.child=[]) parents.forEach(function(e){ arr.forEach((r)=> r.parent == e.id? e.child.push(r) : '') }) parents = parents.filter(elem => elem.child.length < 1? delete elem.child : elem) return parents }
@CristianGarate Sorry I didn't get what you expected for this code. Explain more please
i do a pen link
@CristianGarate, we can optimize, which would make the code uglier. But on the other hand, we can gain the time complexity. You know there are always pros and cons that exist
0

Maybe?

const rows = [
  { id: 1, animal: 'cat', age: 6, name: 'loky' },
  { id: 2, animal: 'cat', age: 3, name: 'michu', parent: 1 },
  { id: 3, animal: 'cat', age: 2, name: 'boots', parent: 1 },
  { id: 4, animal: 'dog', age: 9, name: 'bones' },
  { id: 5, animal: 'dog', age: 6, name: 'chok', parent: 4 },
  { id: 6, animal: 'dog', age: 6, name: 'cofee', parent: 4 },
];

function nester(arr) {
  const parents = rows.filter((r) => !r.parent);
  const children = rows.filter((r) => r.parent);
  return parents.map((p) => {
    return {
      ...p,
      children: children.filter((c) => c.parent === p.id),
    };
  });
}
console.log(nester(rows));

1 Comment

Thanks but supose i put another object like : { "id": 0, "animal": "cat", "age": 10, "name": "oldy" } then with your function add a "children" empty property

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.