9
votes

Comment puis-je reproduire dict.items de Python () dans JavaScript?

Dans Javascript, j'ai un objet JSON à partir duquel je veux traiter uniquement les éléments:

print json.items()
[{stuff: 'stuff'},{stuff: 'stuff'},{stuff: 'stuff'},{stuff: 'stuff'}]


2 commentaires

Je devrais probablement ajouter que la la raison Je veux faire, c'est que je puisse trier le tableau (les clés ne sont que des uids), alors peut-être que j'aurais dû demander "comment trier les articles dans un Array associativ ".


La question est incorrecte. dict.items de Python () renvoie une liste des tuples (touches, de la valeur). Votre exemple de Reval correspond à dict.values ​​() .


5 Réponses :


-3
votes

Je ne sais pas ce que vous voulez faire mais je suppose que JSON.Stringify fera quelque chose comme ça. Voir http://www.json.org/js.html


0 commentaires

4
votes

Vous ne pouvez pas faire cela de la même manière que dans Python sans extension d'objet.Prototype, que vous ne voulez pas faire, car c'est le chemin de la misère.

Vous pouvez créer une fonction d'aide facilement qui pourrait facilement boucler Cependant, l'objet et mettez la valeur dans un tableau, comme ceci: xxx

ps: JSON est un format de données, ce que vous avez est un objet littéral. < / p>


1 commentaires

Point pris sur l'objet littéral, ils sont si étroitement liés à JS que vous pourriez me pardonner sur celui-là.



4
votes

in python dict.items code> renvoie une liste de tuples contenant à la fois les touches et les valeurs du dict code>. JavaScript n'a pas de tuples, il faudrait donc être un tableau imbriqué.

Si vous m'excuserez un petit code Python pour montrer la différence. P>

Object.entries({1:1, 2:2, 3:3})
      .forEach(function(v){
          console.log(v)
      });


4 commentaires

Vous devriez laisser tomber ce .HASOWNPROPERTY () appel. Il n'y a pas d'avantage.


Non, c'est juste c'est assez inutile de là-bas. À quoi sert la condition? Les objets habituels que vous souhaitez énumérer n'auront pas hérité de propriétés énumérables. Et si vous voulez défendre contre ceux qui ont, vous voulez sûrement vous défendre contre ceux qui ont . ShasownProperty propriétés également.


oh ok merci. Je suppose que cela exclurait les propriétés d'une classe mère. Je suis un relatif noob à JavaScript, alors ne le sais pas beaucoup.


S'oser ces choses ne sont que simplement Objet 'S DROITE Alors n'aura que quelque chose qui vaut la peine d'être exclu.



1
votes

Grâce aux mises à jour récentes de JavaScript - nous pouvons résoudre ce problème maintenant:

function items(iterable) {
    return {
        [Symbol.iterator]: function* () {
            for (key in iterable) {
                yield [key, iterable[key]];
            }
        }
    };
}

for (const [key, val] of items({"a": 3, "b": 4, "c": 5})) {
    console.log(key, val);
}
// a 3
// b 4
// c 5

for (const [key, val] of items(["a", "b", "c"])) {
    console.log(key, val);
}
// 0 a
// 1 b
// 2 c


2 commentaires

Ceci est l'équivalent de énumérer en python, pas ce que l'OP a demandé


Dans JS, un tableau est un objet ressemblant à une liste où les clés sont les indices. Pour aider à éviter la confusion, j'ai ajouté un exemple de fonction d'éléments avec un objet. @IuliusCurt fyi



0
votes

La réponse de Ubershmekel utilise une évaluation paresseuse, par rapport à ma réponse ci-dessous qui utilise l'évaluation désireuse. L'évaluation paresseuse présente de nombreux avantages qui le rendent beaucoup plus approprié pour des raisons de performance dans certains cas, mais la transparence de l'évaluation désireuse peut être une frontale de vitesse de développement pouvant le rendre préférable dans d'autres cas.

const keys = Object.keys;

const values = object =>
  keys(object).map(key => object[key]);

const items = object =>
  keys(object).map(key => [key, object[key]])


obj = {a: 10, b: 20, c: 30};

keys(obj)   // ["a", "b", "c"]
values(obj) // [10, 20, 30]
items(obj)  // [["a", 10], ["b", 20], ["c", 30]]

items(obj).forEach(([k, v]) => console.log(k, v))
// a 10
// b 20
// c 30


0 commentaires