Moyen rapide pour obtenir les valeurs min/max entre les propriétés de l'objet
J'ai un objet en javascript comme ceci:
{ "a":4, "b":0.5 , "c":0.35, "d":5 }
Est-il un moyen rapide pour obtenir la valeur minimale et valeur maximale parmi les propriétés sans avoir à boucle à travers eux tous? parce que l'objet que j'ai est énorme et j'ai besoin d'obtenir le min/max de la valeur de toutes les deux secondes. (Les valeurs de l'objet ne cesse de changer).
- Vous avez de l'objet, pas de JSON.
- Eh bien, étant donné que cela, il pourrait très bien être JSON. Youssef: Parser le JSON en objet et itérer sur ses propriétés.
- Je suis en utilisant JSON.parse() ne devraient pas rendre Json?
- Il a été JSON (qui est une valeur de Chaîne) avant l'analyse. C'est un Objet de valeur après l'analyse.
- JSON est la chaîne de la notation des objets. Lorsque vous analysez JSON à un objet, elle n'est plus dans le format JSON
- La valeur que vous avez passer à
JSON.parse
est une chaîne de caractères contenant JSON. Le résultat est un objet. (c'est peut-être ce que tu veux dire) - Je suis en essayant d'éviter de parcourir l'ensemble de données parce qu'il est énorme et il doit être effectué toutes les 2 secondes. l'habitude qui affectent les performances?
- Est-ce à dire toutes les secondes, vous obtenez de nouvelles en JSON contenant toutes les données?
- pas de. J'ai les données et je fais des opérations mathématiques sur certains des champs toutes les deux secondes et ensuite il fallait trouver le nouveau mini/max
- Si vous avez réellement un objet avec l'évolution des champs et que vous voulez toujours savoir les valeurs min et max. Voir carlosfigueira de réponse. Votre problème ne semble pas être liée à JSON à tous btw.
- J'ai pris la liberté de fixation JSON -> objet de votre question, que les commentaires de confirmer que c'est ce que vous avez voulu dire.
- oui merci. ne savais pas que
- Mis à jour ma solution pour utiliser le fait que les Objets conservent leur ordre dans l'ES6: stackoverflow.com/a/53661894/4722345
Vous devez vous connecter pour publier un commentaire.
Il n'y a pas moyen de trouver le maximum /minimum dans le cas général, sans boucle, à travers toutes les n éléments (si vous allez de 1 à n-1, comment savez-vous si l'élément n n'est pas plus grand (ou plus petit) que le courant max/min)?
Vous avez mentionné que les valeurs changent toutes les deux secondes. Si vous connaissez exactement les valeurs de changement, vous pouvez commencer avec votre précédente valeurs max/min, et qu'à comparer avec les nouveaux, mais même dans ce cas, si l'une des valeurs qui ont été modifiées était votre ancienne max/min, vous pouvez avoir besoin pour faire une boucle à travers eux à nouveau.
Une autre alternative, encore une fois, seulement si le nombre de valeurs qui changent sont les petits - serait de stocker les valeurs dans une structure telle qu'un arbre ou d'un segment, et que les nouvelles valeurs arriver vous seriez d'insérer (ou mise à jour) de façon appropriée. Mais si vous pouvez le faire n'est pas clair basé sur votre question.
Essayez ceci:
et puis:
Démo Live: http://jsfiddle.net/7GCu7/1/
Mise à jour: version Moderne (ES6+)
JS:
max = Object.keys(obj).reduce(function(m, k){ return obj[k] > m ? obj[k] : m }, -Infinity);
Math.max(...arr);
Object.keys()
API retourne un tableau, mais je ne pense pas que l'ordre puisse être invoqué (l'ordre peut changer entre les navigateurs, ou au fil du temps).min
etmax
ont d'une boucle sur le tableau d'entrée de toute façon - sinon, comment auraient-ils le plus grand ou le plus petit élément?Donc juste un petit
for..in
boucle fonctionne très bien.O(n log n)
, qui est intrinsèquement plus lente que laO(n)
que juste analyse par l'intermédiaire d'une fois, ce serait...Vous pourriez essayer:
À l'aide de la lodash bibliothèque vous pouvez écrire moins
Pour les structures imbriquées de profondeur différente, c'est à dire
{node: {leaf: 4}, leaf: 1}
, cela fonctionne (à l'aide de lodash ou un trait de soulignement):Voici une solution qui vous permet de revenir sur la touche aussi bien et ne fait qu'une seule boucle. Il trie de l'Objet (par val), puis renvoie le premier et le dernier.
En outre, il renvoie l'triés Objet qui peut remplacer l'Objet existant, de sorte qu'à l'avenir les sortes sera plus rapide car il sera déjà semi-triés = mieux que O(n). Il est important de noter que les Objets conservent leur ordre dans l'ES6.
JS:
Vous pouvez aussi essayer avec
Object.values
JS:
Cela fonctionne pour moi: