2017-09-27 4 views
1

J'ai une exigence étrange pour extraire les valeurs de l'objet JSON par des valeurs, par exemple dans l'objet json ci-dessous, deux tableaux sont là si je passe la valeur comme Steve au lieu de la valeur complète comme Steve Jon, Comment je boucle tout mon objet json et trouve l'objet correspondant dans l'objet entier json. Mon objet json est très grand et s'il vous plaît me suggérer un bon moyen de boucler l'objet entier sans tuer les performances. J'ai vérifié l'expression JSONPath mais sa ne fonctionne pasComment puis-je récupérer des valeurs json avec du texte/caractères NON valeur clé

Merci à l'avance

grouped_people: { 
    'friends': [ 
     {name: 'Steve Jon', country: 'NZ'}, 
     {name: 'Jane Ken', country: 'US'}, 
     {name: 'Mike Jhon', country: 'AU'}, 
     {name: 'Mary Mani', country: 'NZ'}, 
    ], 
    'enemies': [ 
     {name: 'Evil Steve', country: 'AU'}, 
     {name: 'Betty', country: 'NZ'}, 
    ] 
} 
+0

la g ood vieux mode pour/foreach loop – madalinivascu

+0

@madalinivascu mais cela va tuer la performance .. S'il vous plaît donner un exemple –

+0

si vos données json est grand, puis créer un autre api pour aller chercher les données en fonction du nom fourni. Créez une méthode get et un nom de passe comme argument et utilisez cette recherche dans la base de données et renvoyez le résultat. –

Répondre

0

Vous pouvez utiliser une fonction recursive pour trouver la object qui contient la valeur donnée ci-dessous.

var grouped_people = { 
 
    'friends': [{ 
 
     name: 'Steve Jon', 
 
     country: 'NZ' 
 
    }, 
 
    { 
 
     name: 'Jane Ken', 
 
     country: 'US' 
 
    }, 
 
    { 
 
     name: 'Mike Jhon', 
 
     country: 'AU' 
 
    }, 
 
    { 
 
     name: 'Mary Mani', 
 
     country: 'NZ' 
 
    }, 
 
    ], 
 
    'enemies': [{ 
 
     name: 'Evil steve', 
 
     country: 'AU' 
 
    }, 
 
    { 
 
     name: 'Betty', 
 
     country: 'NZ' 
 
    }, 
 
    ] 
 
}; 
 

 
//Recursive function to search text in the object 
 
function findObject(obj, text, callback) { 
 
    for (var k in obj) { 
 
    if (typeof obj[k] == "object" && obj[k] !== null) { 
 
     findObject(obj[k], text, callback); 
 
    } else { 
 
     if (obj[k].toLowerCase().indexOf(text.toLowerCase()) !== -1) { 
 
     callback(obj);    
 
     } 
 
    } 
 
    } 
 
} 
 

 

 
findObject(grouped_people, "Steve", function(obj) { 
 
    //All matched objects will return here. 
 
    console.log(obj); 
 
});

+0

On dirait bien et comme prévu, mais le défi viendra pour un grand objet json –

+0

@MallikarjunHampannavar Il n'y a pas d'autre solution que de parcourir l'objet entier puisque vous voulez que l'objet soit la sortie. :( – Thusitha

+0

Oui, vous avez raison bro .. Je vérifie cela pour mon grand objet permet de voir la performance –

0

Je pense que la fonction de soufflage (du projet angulaire de Google) peut-être vous aider:

/* Seach in Object */ 

var comparator = function(obj, text) { 
if (obj && text && typeof obj === 'object' && typeof text === 'object') { 
    for (var objKey in obj) { 
     if (objKey.charAt(0) !== '$' && hasOwnProperty.call(obj, objKey) && 
       comparator(obj[objKey], text[objKey])) { 
      return true; 
     } 
    } 
    return false; 
} 
text = ('' + text).toLowerCase(); 
return ('' + obj).toLowerCase().indexOf(text) > -1; 
}; 

var search = function(obj, text) { 
if (typeof text == 'string' && text.charAt(0) === '!') { 
    return !search(obj, text.substr(1)); 
} 
switch (typeof obj) { 
    case "boolean": 
    case "number": 
    case "string": 
     return comparator(obj, text); 
    case "object": 
     switch (typeof text) { 
      case "object": 
       return comparator(obj, text); 
      default: 
       for (var objKey in obj) { 
        if (objKey.charAt(0) !== '$' && search(obj[objKey], text)) { 
         return true; 
        } 
       } 
       break; 
     } 
     return false; 
    case "array": 
     for (var i = 0; i < obj.length; i++) { 
      if (search(obj[i], text)) { 
       return true; 
      } 
     } 
     return false; 
    default: 
     return false; 
} 
}; 

Voir this post.

0

En fonction de votre objet, vous pouvez le faire:

for (var key in obj) { 
    if (obj.hasOwnProperty(key)) { 
    for (var subKey in obj[key]) {   
    if(obj[key][subKey].name.toLowerCase().search(keyword)!=-1){ 
     alert('The keyword exist') 
     return true; 
    } 
    }  

    } 
    alert('not found'); 
    return false; 
} 

Je suppose que vous passez le mot-clé par une forme, par exemple, vous pouvez passer à une méthode comme ci-dessous:

<input type="text" id="keyword" placeholder="Enter Keyword" /> 
<input type="button" onclick="find(keyword.value)" value="find" /> 

J'ai fait un exemple pour vous ici (mise à jour pour la recherche insensible à la casse):

https://jsfiddle.net/emilvr/9o8s2680/2/

+0

Bon mais sensible à la casse –

+0

Eh bien, nous avons juste besoin d'utiliser toLowerCase() pour couvrir tout, je mettre à jour le code;) –