2
votes

Rechercher récursivement un nom de propriété {String} dans un objet JSON et renvoyer la valeur associée

J'essaie de rechercher un nom de propriété dans un json et de renvoyer sa valeur si la propriété peut être trouvée, ou null dans le cas contraire.

function returnValueAtProperty(string, exampleObject) {
  for (ch1 in exampleObject) {
    if (ch1 === string) {
      return exampleObject[ch1];
    } else if (typeof(exampleObject[ch1]) == 'object') {
      var ob = exampleObject[ch1]
      for (ch2 in ob) {
        return returnValueAtProperty(string, ob[ch2])
      }
    } else if (Array.isArray(exampleObject[ch1])) {
      var arr = exampleObject[ch1];
      for (var i = 0; i < arr.length;) {
        return returnValueAtProperty(string, arr[i])
      }
    }
  }
}

var exampleObject = {
  "key0": 42,
  "key1": {
    "key2": [{
        "key3": "tag",
        "key4": false
      },
      {
        "key5": null,
        "key6": [3, 141]
      }
    ],
    "key7": null
  }
}

console.log(returnValueAtProperty("key3", exampleObject));

La fonction doit renvoyer la chaîne "tag". ou si j'appelle la fonction comme returnValueAtProperty ("key6", exampleObject), elle devrait renvoyer le tableau


2 commentaires

prenez-vous vraiment null comme indicateur pour les valeurs non trouvées, même si vous avez null comme valeur à l'intérieur de l'objet?


Désolé pour la réponse tardive! Je suis un QA et ce problème a été donné comme un exercice dans un test pour le poste de test d'automatisation


4 Réponses :


0
votes

Je viens de changer un peu votre code Je crois que si vous changez la vérification du tableau avant la vérification de l'objet, ce sera mieux, en javascript même un type de tableau peut renvoyer un objet si probable que les tableaux son pénétrer dans le premier sinon si ci-dessous je vous montre le changement de code que j'ai fait

for(ch1 in exampleObject){
               if(typeof ch1 === string){
                   return exampleObject[ch1];
               }  else if(Array.isArray(exampleObject[ch1])){
                   var arr = exampleObject[ch1];
                   for(var i=0; i<arr.length;){
                       return returnValueAtProperty(string,arr[i])
                   }
               }
                else if(typeof(exampleObject[ch1])=='object'){
                   var ob = exampleObject[ch1]
                   for(ch2 in ob){
                        return returnValueAtProperty(string, ob[ch2])
                   }
               } 
           }


0 commentaires

0
votes

Vous pouvez prendre une seule boucle et renvoyer n'importe quelle valeur, du moment qu'elle n'est pas null.

function getValue(object, key) {
    var k, temp;
    if (key in object) return object[key];
    for (k in object) {
        if (object[k] && typeof object[k] === 'object') {
            temp = getValue(object[k], key);
            if (temp !== undefined) return temp;
        }
    }
}

var object = { key0: 42, key1: { key2: [{ key3: "tag", key4: false }, { key5: null, key6: [3, 141] }], key7: null } };

console.log(getValue(object, "key3"));
console.log(getValue(object, "key6"));
console.log(getValue(object, "key7"));
console.log(getValue(object, "foo"));

Une approche légèrement meilleure en prenant undefined comme valeur non existante.

function getValue(object, key) {
    var k, temp;
    if (key in object) return object[key];                // if found return value
    for (k in object) {                                   // iterate keys
        if (object[k] && typeof object[k] === 'object') { // check not null and object
            temp = getValue(object[k], key);              // get sub value, if exists
            if (temp !== null) return temp;               // if not null return value
        }
    }
    return null;
}

var object = { key0: 42, key1: { key2: [{ key3: "tag", key4: false }, { key5: null, key6: [3, 141] }], key7: null } };

console.log(getValue(object, "key3"));
console.log(getValue(object, "key6"));
console.log(getValue(object, "key7"));
console.log(getValue(object, "foo"));


1 commentaires

@jujiyangasli, quel est le problème où vous avez une réponse?



0
votes

 entrez la description de l'image ici

function returnValueAtProperty(string,obj){

  for(var i in obj){

    if(i === string)
      return obj[i]

    else if(obj[i].constructor === Object) {
      const val = returnValueAtProperty(string, obj[i]);
      if(val) return val;
    }

  }

  return null;
}


0 commentaires

0
votes

Vous y avez fait quelques erreurs triviales.

Vérifiez ceci:

function returnValueAtProperty(string, exampleObject) {
  for (ch1 in exampleObject) {
    if (ch1 === string) {
      return exampleObject[ch1];
    } else if (typeof(exampleObject[ch1]) == 'object') {
      var ob = exampleObject[ch1];
      return returnValueAtProperty(string, ob);
    } else if (Array.isArray(exampleObject[ch1])) {
      var arr = exampleObject[ch1];
      for (var i = 0; i < arr.length;++i) {
        return returnValueAtProperty(string, arr[i])
      }
    }
  }
}

var exampleObject = {
  "key0": 42,
  "key1": {
    "key2": [{
        "key3": "tag",
        "key4": false
      },
      {
        "key5": null,
        "key6": [3, 141]
      }
    ],
    "key7": null
  }
}

console.log(returnValueAtProperty("key3", exampleObject));


1 commentaires

Désolé pour la réponse tardive! Cela fonctionne pour cette clé, mais si je la change avec 'key5' par exemple, cela ne fonctionne pas!