64 votes

L'équivalent en Javascript de la fonction list() de PHP

J'aime beaucoup cette fonction.

$matches = array('12', 'watt');
list($value, $unit) = $matches;

Y a-t-il un équivalent Javascript de cela ?

0 votes

Ce qui ne va pas avec une approche standard var value = matches[0]; var unit = matches[1];

7 votes

Eh bien, ce n'est pas très concis, n'est-ce pas ?

2 votes

Je n'ai jamais senti list() pour être utile et ce qui précède me semble être une objection. var power = { 'unit': 'watt', 'amount': 12 }

57voto

Nicolás Points 4959

C'est le cas dans les versions "plus récentes" de Javascript : Mission de déstructuration - Javascript 1.7 . Il n'est probablement supporté que par les navigateurs basés sur Mozilla, et peut-être par Rhino.

var a = 1;  
var b = 3;  

[a, b] = [b, a];  

EDITAR: En fait, je ne serais pas surpris que la bibliothèque Javascript V8 (et donc Chrome) prenne en charge cette fonctionnalité. Mais n'y comptez pas non plus Maintenant supporté par dans tous les navigateurs modernes( sauf IE bien sûr).

6 votes

Super ! J'aime vraiment toutes les choses cool qu'ils ont mis dans les nouvelles versions de Javascript ! J'ai juste l'impression que nous ne pourrons pas les utiliser avant longtemps

1 votes

Année 2015 et toujours pas soutenu par V8.

1 votes

Firefox le prend en charge depuis la version 2 en 2006. Il n'est toujours pas pris en charge par V8/Chrome en 2015. Chrome est le nouvel IE.

19voto

The Mask Points 5925

Essayez ceci :

matches = ['12', 'watt'];
[value, unit] = matches;

4voto

lac_dev Points 69

Voici ma solution pour utiliser List/Explode en Javascript. Exemple de travail de violon

D'abord la mise en œuvre :

var dateMonth = "04/15";
dateMonth.split("/").list("month","day", "year");
month == "04";
day == "15";
year == null;

Il permet également de délimiter les nouvelles variables générées :

var scoped = (function()
{ 
    var dateMonth = "07/24/2013"; 
    dateMonth.split("/").list("month","day", "year", this);
    this.month == "07";
    this.day == "24";
    this.year == "2013";
})();

Pour ce faire, nous avons modifié le prototype Array.

Array.prototype.list = function()
{
    var 
        limit = this.length,
        orphans = arguments.length - limit,
        scope = orphans > 0  && typeof(arguments[arguments.length-1]) != "string" ? arguments[arguments.length-1] : window 
    ;

    while(limit--) scope[arguments[limit]] = this[limit];

    if(scope != window) orphans--;

    if(orphans > 0)
    {
        orphans += this.length;
        while(orphans-- > this.length) scope[arguments[orphans]] = null;  
    }  
}

0 votes

Je m'en tiens à ma solution. Si vous essayez quelque chose comme : matches = ['12', 'watt'] ; [value, unit] = matches ; Or function () { var [year, month] = $(this).val().split("/") ; Dans Chrome, il y aura une erreur : "ReferenceError : Invalid left-hand side in assignment"

0 votes

Utilisation de window comme objet par défaut est une très mauvaise idée.

0 votes

@Bergi il ne le fait que par défaut. Vous pouvez fournir un objet comme dernier paramètre et il l'utilisera.

2voto

powtac Points 18619

Il existe une implémentation expérimentale de list() par PHPJS ici :
https://github.com/kvz/phpjs/blob/master/_experimental/array/list.js

0 votes

Le deuxième lien de ce post est mort ( 404 - Ce n'est pas la page web que vous recherchez ).

2voto

00Davo Points 482

CoffeeScript offre une affectation de déstructuration avec la syntaxe :

[a, b] = someFunctionReturningAnArray()

Cette fonction est à peu près identique à celle proposée dans les toutes nouvelles versions de JavaScript. Cependant, CoffeeScript produit un JS compilé qui est compatible même avec le moteur JavaScript d'IE6, et c'est donc une bonne option si la compatibilité est vitale.

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