Considérant que j'ai un objet comme celui-ci:
const o = {
name: 'name1',
age: 1,
children: [{
name: 'name21',
age: 21,
children: [{
name: 'name31',
age: 31,
children: []
}]
}, {
name: 'name22',
age: 22,
children: []
}]
}
const parser = obj => {
const result = {}
const { name, age } = obj
const key = `${name}_${age}`
if (obj.children.length > 0) {
obj.children.forEach(child => {
result[key] = parser(child)
})
} else {
result[key] = {}
}
return result
}
console.log(parser(o)) // { "name1_1": { "name22_22": {} } }Il a trois propriétés, la propriété children pourrait être un tableau vide représentant qu'il n'a pas d'enfant. Je souhaite transformer cet objet au format suivant:
const newObject = {
name1_1: {
name21_21: {
name31_31: {}
},
name22_22: {}
}
}
La clé sera au format name_key , et la valeur sera ses enfants associés , si l'objet n'a pas d'enfants, la valeur sera juste un objet vide.
Voici mon implémentation:
const o = {
name: 'name1',
age: 1,
children: [{
name: 'name21',
age: 21,
children: [{
name: 'name31',
age: 31,
children: []
}]
}, {
name: 'name22',
age: 22,
children: []
}]
}
Je ne suis pas sûr de ce que j'ai fait de mal ici, quelqu'un peut-il m'aider un peu s'il vous plaît?
3 Réponses :
Vous pouvez simplement attribuer le résultat des appels récursifs de votre fonction à l'objet actuel, mais avant cela, vous devez également initialiser cet objet s'il n'existe pas.
const o = {"name":"name1","age":1,"children":[{"name":"name21","age":21,"children":[{"name":"name31","age":31,"children":[]}]},{"name":"name22","age":22,"children":[]}]}
const parser = ({ name, age, children }) => {
const result = {}
const key = `${name}_${age}`;
if (!result[key]) result[key] = {}
if (children.length) {
children.forEach(child => {
Object.assign(result[key], parser(child))
})
}
return result;
}
console.log(parser(o))
Bravo, mon frère. Donc ce que j'ai fait de mal, c'est que j'ai utilisé result [key] = parser (child) , et de cette façon, le result sera à chaque fois superposé par le nouveau résultat de l'analyseur (enfant) . Vous utilisez Object.assign pour muter le résultat plutôt que de le chevaucher directement. Ma compréhension est-elle correcte?
Oui et aussi ici, je vérifie toujours s'il y a un résultat [clé] avant et s'il n'y en a pas, je règle sa valeur sur un objet vide.
Dans votre implémentation, result [key] = parser (child) remplace l'objet dans la deuxième itération pour définir result [key] = {name22_22: {}} . Le correctif consiste donc à étendre l'objet result [key] au lieu de le réaffecter.
const o = {
name: 'name1',
age: 1,
children: [{
name: 'name21',
age: 21,
children: [{
name: 'name31',
age: 31,
children: []
}]
}, {
name: 'name22',
age: 22,
children: []
}]
}
const parser = obj => {
const result = {}
const {
name,
age
} = obj
const key = `${name}_${age}`
if (obj.children.length > 0) {
obj.children.forEach(child => {
// result[key] = parser(child);
result[key] = {
...result[key],
...parser(child),
}
})
} else {
result[key] = {}
}
return result
}
console.log(parser(o)) // {name1_1: {name21_21: {name31_31: {}}, name22_22: {}}}
Cool bro, apprécie ça, ton explication est super utile!
Heureux d'aider :)
Il existe déjà une bonne réponse expliquant ce que vous avez mal fait et comment y remédier. Mais je pense que vous travaillez trop dur ici. Laissez la récursion faire le gros du travail et utilisez Object.assign pour coller les choses ensemble. Cela permet une implémentation aussi simple que celle-ci:
const parser = ({name, age, children}) =>
({[`${name}_${age}`]: Object .assign ({}, ... (children || []) .map (parser))})
const o = {name: 'name1', age: 1, children: [{name: 'name21', age: 21, children: [{name: 'name31', age: 31, children: []}]}, {name: 'name22', age: 22, children: []}]}
console .log (parser (o))
pop, pop, bang!