web-dev-qa-db-fra.com

Équivalent Javascript de la liste de PHP ()

Vraiment comme cette fonction.

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

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

54
Znarkus

Il existe, mais dans les "nouvelles" versions de Javascript: Cession de destruction - Javascript 1.7 . Il n'est probablement pris en charge que par les navigateurs basés sur Mozilla, et peut-être par Rhino.

var a = 1;  
var b = 3;  

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

EDIT: en fait, cela ne me surprendrait pas si la bibliothèque Javascript V8 (et donc Chrome) le supporte. Mais n'y comptez pas non plus :)

43
Nicolás

essaye ça:

matches = ['12', 'watt'];
[value, unit] = matches; 
18
The Mask

ES6 supporte cela directement maintenant via array destructuring .

const matches = ['12', 'watt'];
const [value, unit] = matches;
7
Ben Fortune

Ceci est ma solution pour utiliser List/Explode sur Javascript. Fiddle Exemple de travail

D'abord la mise en œuvre: 

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

Cela permet également d’étudier 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";
})();

Cela a été accompli en modifiant un 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;  
    }  
}
4
lac_dev

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

[a, b] = someFunctionReturningAnArray()

C'est à peu près identique à la fonctionnalité offerte dans les toutes nouvelles versions de JavaScript. Cependant, CoffeeScript produit un JS compilé compatible même avec le moteur JavaScript d'IE6. C'est donc une bonne option si la compatibilité est essentielle.

2
00dani

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

2
powtac

Comme la plupart des implémentations JavaScript ne prennent pas encore en charge cette fonctionnalité, vous pouvez simplement le faire de manière plus semblable à JavaScript:

function list(){
    var args = arguments;
    return function(array){
        var obj = {};
        for(i=0; i<args.length; i++){
            obj[args[i]] = array[i];
        }
        return obj;
    };
}

Exemple:

var array = ['GET', '/users', 'UserController'];
var obj = {};

obj = list('method', 'route', 'controller')(array);

console.log(obj.method);        // "GET"
console.log(obj.route);         // "/users"
console.log(obj.controller);    // "UserController"

Vérifiez le violon


Une alternative consiste à ajouter une méthode de liste à Array.prototype (même si je ne le recommanderais pas):

Array.prototype.list = function(){
    var i, obj = {};
    for(i=0; i<arguments.length; i++){
        obj[arguments[i]] = this[i];
    }
    // if you do this, you pass to the dark side `,:,´
    this.props = obj;
    return obj;
};

Exemple:

/**
 * Example 1: use Array.prototype.props
 */

var array = ['GET', '/users', 'UserController'];
array.list('method', 'route', 'controller');

console.log(array.props.method);        // "GET"
console.log(array.props.route);         // "/users"
console.log(array.props.controller);    // "UserController"

/**
 * Example 2: use the return value
 */

var array = ['GET', '/users', 'UserController'];
var props = array.list('method', 'route', 'controller');

console.log(props.method);      // "GET"
console.log(props.route);       // "/users"
console.log(props.controller);  // "UserController"

Vérifiez le violon pour celui-là

1
rckd

Ceci est mon hack à elle; aussi courte que je pouvais l'obtenir sans écrire une fonction pour le faire. Il faut faire attention à la portée de "ceci" cependant:

list = ["a","b","c"];
vals = [1,2,3];
for(var i in vals)this[list[i]]=vals[i];
console.log(a,b,c);

Assez bon pour rire. J'assigne toujours chaque variable une à la fois:

a=vals[0];
b=vals[1];
c=vals[2];

C'est beaucoup plus court de cette façon. De plus, si vous avez un tas de variables, elles devraient probablement être conservées dans le tableau, ou mieux, elles devraient être les propriétés d'une fermeture, au lieu de toutes les déclarer séparément.

0
i_a