真的很喜欢这个功能。
$matches = array('12', 'watt');
list($value, $unit) = $matches;
是否有相当的Javascript?
答案 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"
另一种方法是将一个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"
答案 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);
}
}
}