65 votes

Faire en sorte que Javascript comprenne la liste

Quelle est la façon la plus propre à faire du Javascript faire quelque chose comme Python compréhension de liste?

En Python si j'ai une liste d'objets dont le nom est je veux "sortir", je voudrais faire cela...

list_of_names = [x.name for x in list_of_objects]

En javascript, je ne vois vraiment pas une plus belle façon de faire que d'autres que simplement à l'aide d'une construction de boucle pour.

Pour info: j'utilise jQuery; peut-être qu'il a une certaine fonctionnalité utile qui rend cela possible?

Plus précisément, dis-je utiliser un sélecteur jQuery comme $('input') pour obtenir tous input éléments, comment aurais-je plus proprement créer un tableau de tous les name attributs pour chacun de ces input éléments--c'est à dire, tous les de la $('input').attr('name') chaînes dans un tableau?

54voto

gonchuki Points 2389

cas générique à l'aide de la Matrice.carte, nécessite l'activation de javascript 1.6 (c'est à dire, fonctionne sur tous les navigateurs, mais IE < 9) ou avec un objet augmentant cadre comme MooTools fonctionne sur tous les navigateurs:

var list_of_names = document.getElementsByTagName('input').map(
  function(element) { return element.getAttribute('name'); }
);

jQuery spécifiques, par exemple, fonctionne sur tous les navigateurs:

var list_of_names = jQuery.map(jQuery('input'), function(element) { return jQuery(element).attr('name'); });

les autres réponses à l'aide de .each sont mauvais; pas le code lui-même, mais les implémentations sont sous-optimales.

Edit: il y a aussi Tableau interprétations introduites dans le code Javascript 1.7, mais c'est purement la personne à charge sur la syntaxe et ne peut pas être émulé sur les navigateurs qui manque en mode natif. C'est la chose la plus proche que vous pouvez obtenir en Javascript pour le Python extrait de code que vous avez posté.

11voto

Ben Lesh Points 39290

Une compréhension de liste a un peu de pièces.

  1. La sélection d'un ensemble de quelque chose
  2. À partir d'un ensemble de quelque Chose
  3. Filtré par quelque Chose

En JavaScript, comme des ES5 (donc je pense que c'est pris en charge dans IE9+, Chrome et FF), vous pouvez utiliser l' map et filter fonctions sur un tableau.

Vous pouvez le faire avec la carte et le filtre:

var list = [1,2,3,4,5].filter(function(x){ return x < 4; })
               .map(function(x) { return 'foo ' + x; });

console.log(list); //["foo 1", "foo 2", "foo 3"]

C'est à peu près aussi bon qu'il aille se faire sans mettre en place d'autres méthodes ou d'utiliser un autre cadre.

Comme pour la question spécifique...

Avec jQuery:

$('input').map(function(i, x) { return x.name; });

Sans jQuery:

var inputs = [].slice.call(document.getElementsByTagName('input'), 0),
    names = inputs.map(function(x) { return x.name; });

[].slice.call() , c'est juste pour convertir l' NodeList d'un Array.

6voto

Chris W. Points 7182

Ceux qui sont intéressés dans la "belle" Javascript doit probablement découvrez CoffeeScript, un langage qui se compile en Javascript. Il existe essentiellement parce que Javascript est manquant des choses comme la compréhension de liste.

En particulier, Coffeescript la compréhension de liste est encore plus souple que le Python. Voir la liste compréhension de docs ici.

Par exemple, le code pourrait résultat dans un tableau d' name attributs d' input - éléments.

[$(inp).attr('name') for inp in $('input')]

Un potentiel inconvénient cependant est le Javascript est détaillé (et à mon humble avis à confusion):

var inp;
[
  (function() {
    var _i, _len, _ref, _results;
    _ref = $('input');
    _results = [];
    for (_i = 0, _len = _ref.length; _i < _len; _i++) {
      inp = _ref[_i];
      _results.push($(inp).attr('name'));
    }
    return _results;
  })()
];

4voto

darkporter Points 7552

Les interprétations de liste de python font donc deux choses à la fois: la cartographie et le filtrage. Par exemple:

 list_of_names = [x.name for x in list_of_object if x.enabled]
 

Si vous voulez seulement la partie mapping, comme votre exemple le montre, vous pouvez utiliser la fonctionnalité map de jQuery. Si vous avez également besoin d'un filtrage, vous pouvez utiliser la fonction "grep" de jQuery.

2voto

typeof Points 2001

Une façon réutilisable de le faire est de créer un plugin jQuery minuscule comme ceci:

 jQuery.fn.getArrayOfNames = function() {
    var arr = [];
    this.each( function() { arr.push(this.name || ''); } );
    return arr;
};
 

Ensuite, vous pourriez l'utiliser comme ceci:

 var list_of_names = $('input').getArrayOfNames();
 

Ce n'est pas une compréhension de liste, mais cela n'existe pas en javascript. Tout ce que vous pouvez faire, c'est utiliser javascript et jquery pour ce à quoi il sert.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X