Communauté! Veuillez me donner un indice. J'ai la tâche suivante:
Tout d'abord, créez un objet avec cette structure:
function convert(obj){
newObj = {};
for(key in obj){
newObj[key] = obj[key];
}
}
convert(obj);
Ecrivez la fonction convert (obj), elle obtient l'argument obj. La fonction doit renvoyer un nouvel objet:
newObj = {
x: 20,
y: 20,
z: 30,
k: 23,
p: 13
}
La fonction doit contenir for ... in ... et typeof uniquement.
J'essaye de créer cette fonction, obj est copiée dans newObj maintenant:
obj = {
x: 10,
y: 20,
inner: {
x: 20,
z: 30
},
foo2: {
k: 23,
p: 13
}
}
Mais je ne sais pas comment utiliser le typeof pour supprimer les sous-objets inner et foo2 de obj et attribuer les valeurs appropriées de x, z, k et p au newObj.
En classe, nous parlions de calculs d'objets de base, donc aucune méthode d'objet sophistiquée n'est censée être nécessaire pour résoudre cela.
p >
3 Réponses :
Vous avez besoin d'une récursion dans ce cas
obj = {
x: 10,
y: 20,
inner: {
x: 20,
z: 30
},
foo2: {
k: 23,
p: 13
}
}
function convert(obj, newObj) {
if (!newObj) { // on first iteration creating a result object
newObj = {}
}
for(key in obj){
if (typeof obj[key] === 'number') { // if number - add, if exist - update
newObj[key] = obj[key];
} else { // if object - do the same one more time but for subobject and resulting object
convert(obj[key], newObj)
}
}
return newObj
}
console.log(convert(obj));
Si la profondeur des objets internes ne dépasse jamais 1, la récursivité ne sera pas nécessaire. Il est difficile de savoir si leur professeur s'attend à ce qu'ils utilisent la récursivité ou non. La récursivité est certainement appropriée et recommandée ici.
@byxor ouais, d'accord, on ne sait souvent pas comment leur tuteur s'attend à faire la tâche
@qiAlex Merci! Je ne connaissais pas la récursivité. Tu m'as beaucoup aidé
function convert(obj){
newObj = {};
for(key in obj){
if(typeof(obj[key])==='object')
{
for(k in obj[key])
{
newObj[k]=obj[key][k]
}
}else{
newObj[key]=obj[key]
}
}
return newObj
}
Contrairement aux réponses récursives fournies, cela ne fonctionnera qu'à une profondeur fixe.
Vous pouvez le faire très facilement avec Object.entries , Object.fromEntries , fonctions de générateur et un peu de récursivité.
Parce que la dernière entrée pour une propriété l'emporte lors de l'utilisation de Object.fromEntries , tant que nous s'aplatissons dans l'ordre des documents, l'entrée "la plus récente" l'emportera.
const obj = {x: 10, y: 20, inner: {x: 20, z: 30}, foo2: {k: 23, p: 13}}
function* getFlattenedEntries(obj) {
let entries = Object.entries(obj);
for (const [k, v] of entries) {
// typeof array is "object", so we should guard against this
if (typeof v === "object" && !Array.isArray(v)) {
yield* getFlattenedEntries(v);
} else {
yield [k, v];
}
}
}
const flatten = obj => Object.fromEntries(getFlattenedEntries(obj));
console.log(flatten(obj))
Lorsque vous parcourez chaque propriété de
obj, vous voulez faire des choses différentes selon que la propriété est un objet ou un nombre. Ces 2 comportements peuvent être implémentés avec un contrôleif / elseettypeof. Pour chaque propriété ... Si la propriété est un nombre, stockez-le! Sinon, si la propriété est un objet, traitez toutes les propriétés de cet objet.De plus, vous vouliez probablement écrire
newObj [key] = obj [key]@byxor Oui, merci, je viens de corriger ça.
@byxor Je devrais donc écrire quelque chose comme: function convert (obj) {newObj = {}; for (var key in obj) {if (typeof obj [key] == 'number') {newObj [key] = obj [key]; } else {}} return newObj; } Mais que doit contenir l'instruction else pour traiter les sous-objets?
Oui, vous êtes proche d'une solution fonctionnelle. Dans votre instruction else, vous devez soit utiliser la récursivité, soit une autre boucle for, en fonction de ce que votre professeur attend de vous. La réponse de qiAlex démontre l'approche récursive. La réponse de Merci démontre une approche non récursive.
J'ai pris la liberté de changer le titre de votre question en quelque chose qui se rapporte réellement à ce que vous demandez.
@spender Bonjour, super, merci :)
@byxor Merci d'avoir pris votre temps sur celui-ci!