(Vous ne cherchez pas dans "JSON", vous cherchez dans un tableau -- la chaîne JSON a déjà été désérialisée en un graphe d'objets, dans ce cas un tableau).
Quelques options :
Utiliser un objet au lieu d'un tableau
Si vous contrôlez la génération de cette chose, est-ce que ont pour être un tableau ? Parce que si ce n'est pas le cas, il y a un moyen beaucoup plus simple.
Disons que ce sont vos données originales :
[
{"id": "one", "pId": "foo1", "cId": "bar1"},
{"id": "two", "pId": "foo2", "cId": "bar2"},
{"id": "three", "pId": "foo3", "cId": "bar3"}
]
Pourriez-vous plutôt faire ce qui suit ?
{
"one": {"pId": "foo1", "cId": "bar1"},
"two": {"pId": "foo2", "cId": "bar2"},
"three": {"pId": "foo3", "cId": "bar3"}
}
Il est alors trivial de trouver l'entrée pertinente par ID :
id = "one"; // Or whatever
var entry = objJsonResp[id];
...tout comme sa mise à jour :
objJsonResp[id] = /* New value */;
...et de l'enlever :
delete objJsonResp[id];
Cette méthode tire parti du fait qu'en JavaScript, vous pouvez indexer un objet en utilisant le nom d'une propriété sous la forme d'une chaîne de caractères - et cette chaîne peut être littérale ou provenir d'une variable, comme dans l'exemple suivant id
ci-dessus.
Mise en place d'une carte ID-to-Index
(Idée stupide, antérieure à ce qui précède. Conservée pour des raisons historiques).
Il semble que vous ayez besoin que ce soit un tableau, auquel cas il n'y a pas vraiment de meilleur moyen que de chercher dans le tableau, à moins que vous ne vouliez mettre une carte dessus, ce que vous pourriez faire si vous avez le contrôle de la génération de l'objet. Par exemple, disons que vous avez ceci à l'origine :
[
{"id": "one", "pId": "foo1", "cId": "bar1"},
{"id": "two", "pId": "foo2", "cId": "bar2"},
{"id": "three", "pId": "foo3", "cId": "bar3"}
]
Le code de génération pourrait fournir une carte d'identification à l'index :
{
"index": {
"one": 0, "two": 1, "three": 2
},
"data": [
{"id": "one", "pId": "foo1", "cId": "bar1"},
{"id": "two", "pId": "foo2", "cId": "bar2"},
{"id": "three", "pId": "foo3", "cId": "bar3"}
]
}
Puis obtenir une entrée pour l'id dans la variable id
est trivial :
var index = objJsonResp.index[id];
var obj = objJsonResp.data[index];
Cette méthode tire parti du fait que vous pouvez indexer les objets en utilisant les noms des propriétés.
Bien sûr, si vous faites cela, vous devez mettre à jour la carte lorsque vous modifiez le tableau, ce qui pourrait devenir un problème de maintenance.
Mais si vous ne contrôlez pas la génération de l'objet, ou si la mise à jour de la carte des identifiants et des index représente trop de code et/ou un problème de maintenance, vous devrez alors effectuer une recherche par force brute.
Recherche par force brute (corrigée)
Un peu OT (bien que vous a fait demander s'il y avait un meilleur moyen :-) ), mais votre code pour boucler dans un tableau est incorrect. Détails ici mais vous ne pouvez pas utiliser for..in
pour boucler les index des tableaux (ou plutôt, si vous le faites, vous devez prendre des précautions particulières pour le faire) ; for..in
boucles à travers le les propriétés d'un objet et non le indices d'un tableau . Votre meilleure chance avec un tableau non épars (et le vôtre est non épars) est une bonne vieille boucle standard :
var k;
for (k = 0; k < someArray.length; ++k) { /* ... */ }
ou
var k;
for (k = someArray.length - 1; k >= 0; --k) { /* ... */ }
Peu importe ce que vous préférez (cette dernière solution n'est pas toujours plus rapide dans toutes les implémentations, ce qui est contre-intuitif pour moi, mais nous y sommes). (Avec un éparses vous pouvez utiliser for..in
mais en prenant soin d'éviter les pièges ; voir l'article ci-dessus).
Utilisation de for..in
sur un tableau semble pour fonctionner dans des cas simples car les tableaux ont des propriétés pour chacun de leurs index, et leurs seules autres propriétés par défaut ( length
et leurs méthodes) sont marqués comme non dénombrables. Mais cela s'arrête dès que vous définissez (ou qu'un framework définit) d'autres propriétés sur l'objet tableau (ce qui est parfaitement valide ; les tableaux sont juste des objets avec une gestion un peu spéciale autour de la balise length
propriété).
0 votes
Quelqu'un a-t-il remarqué que les suppressions ne modifient pas la longueur et que la position de l'élément @supprimé peut rester indéfinie (aucune réindexation n'est effectuée) à moins qu'il ne s'agisse du dernier élément, la diminution de la longueur pour corriger cela supprime le dernier élément ? Splice semble les mettre à jour.