Javascript эквивалент списка PHP () - PullRequest
56 голосов
/ 23 декабря 2009

Действительно, как эта функция.

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

Есть ли Javascript-эквивалент этого?

Ответы [ 9 ]

45 голосов
/ 23 декабря 2009

Есть, но в «новых» версиях Javascript: Разрушающее присваивание - Javascript 1.7 . Вероятно, это поддерживается только в браузерах на основе Mozilla, а может быть и в Rhino.

var a = 1;  
var b = 3;  

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

РЕДАКТИРОВАТЬ: на самом деле меня не удивит, если библиотека V8 Javascript (и, следовательно, Chrome) поддерживает это. Но на это тоже не рассчитывайте:)

18 голосов
/ 16 июня 2011

попробуйте это:

matches = ['12', 'watt'];
[value, unit] = matches; 
10 голосов
/ 27 ноября 2015

ES6 поддерживает это прямо сейчас через деструктуризацию массива .

const matches = ['12', 'watt'];
const [value, unit] = matches;
4 голосов
/ 24 июля 2013

Это мое решение для использования List / Explode на Javascript. Пример работы с скрипкой

Первая реализация:

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

Это также позволяет определять новые сгенерированные переменные:

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

Это было достигнуто путем изменения прототипа 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;  
    }  
}
2 голосов
/ 11 декабря 2012

CoffeeScript предлагает назначение деструктурирования с синтаксисом:

[a, b] = someFunctionReturningAnArray()

Это очень похоже на функцию, предлагаемую в очень новых версиях JavaScript. Однако CoffeeScript создает скомпилированный JS, который совместим даже с механизмом JavaScript IE6, и поэтому это хороший вариант, если совместимость жизненно необходима.

2 голосов
/ 24 марта 2011

Существует экспериментальная реализация list() от PHPJS здесь:
https://github.com/kvz/phpjs/blob/master/_experimental/array/list.js

1 голос
/ 27 ноября 2015

Поскольку большинство реализаций JavaScript еще не поддерживают эту функцию, вы можете просто сделать это более похожим на 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;
    };
}

Пример:

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"

Проверьте скрипку


Альтернативой является добавление метода списка в Array.prototype (даже я бы не рекомендовал его):

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;
};

Пример:

/**
 * 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"

Проверить это на скрипке

0 голосов
/ 11 сентября 2015
function list(fn,array){
    if(fn.length && array.length){
        for(var i=0;i<array.length;i++){
            var applyArray = [];
            for(var j=0;j<array[i].length;j++){
                fn[j] = array[i][j];
                applyArray.push(fn[j]);
            }
        fn.apply(this,applyArray);
       }
   }
}

Пример:

//array array mixture for composure
var arrayMixture = [ ["coffee","sugar","milk"], ["tea","sugar","honey"] ];
//call our function


list(function(treat,addin,addin2){
    console.log("I like "+treat+" with " + addin + " and " + addin2);
},arrayMixture);


//output:
//I like coffee with sugar and milk
//I like tea with sugar and honey
0 голосов
/ 22 марта 2015

Это мой хак на это; так коротко, как я мог получить это без написания функции, чтобы сделать это. Должен быть осторожен с областью «это», хотя:

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

Достаточно хорошо для смеха. Я по-прежнему присваиваю каждую переменную по одной:

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

Так намного короче. Кроме того, если у вас есть куча переменных, они, вероятно, должны храниться в массиве, или, что еще лучше, они должны быть свойствами замыкания, а не объявлять их все по отдельности.

...