Javascript相当于PHP的列表()

时间:2009-12-23 18:11:53

标签: php javascript list phpjs

真的很喜欢这个功能。

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

是否有相当的Javascript?

9 个答案:

答案 0 :(得分:45)

有Javascript的“新”版本:Destructuring assignment - Javascript 1.7。它可能只在基于Mozilla的浏览器中支持,也可能在Rhino中支持。

var a = 1;  
var b = 3;  

[a, b] = [b, a];  
编辑:实际上,如果V8 Javascript库(以及Chrome)支持这一点,我也不会感到惊讶。但是不要指望它:)

答案 1 :(得分:18)

试试这个:

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

答案 2 :(得分:9)

ES6现在通过array destructuring直接支持此功能。

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

答案 3 :(得分:4)

这是我在Javascript上使用List / Explode的解决方案。 Fiddle Working Example

首先执行:

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

答案 4 :(得分:2)

这里list()的{​​{1}}实验性实施: PHPJS

答案 5 :(得分:2)

CoffeeScript使用语法提供解构赋值:

[a, b] = someFunctionReturningAnArray()

这与非常新的JavaScript版本提供的功能非常相似。但是,CoffeeScript生成的编译JS即使与IE6的JavaScript引擎兼容,因此如果兼容性至关重要,它也是一个不错的选择。

答案 6 :(得分:1)

由于大多数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"

Check the fiddle

另一种方法是将一个list-method添加到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"

Check the fiddle for that one

答案 7 :(得分:0)

这是我的黑客攻击;只要我没有编写函数就可以得到它。但是要注意“这个”的范围:

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

这种方式要短得多。此外,如果你有一堆变量,它们应该保存在数组中,或者更好的是它们应该是闭包的属性,而不是单独声明它们。

答案 8 :(得分:-2)

ftp.exe

示例:

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