本当にその機能が好きです。
$matches = array('12', 'watt');
list($value, $unit) = $matches;
それに相当するJavascriptはありますか?
ありますが、Javascriptの「新しい」バージョンでは、 割り当ての破壊-Javascript 1.7 です。おそらくMozillaベースのブラウザーでのみ、おそらくRhinoでのみサポートされています。
var a = 1;
var b = 3;
[a, b] = [b, a];
編集:実際には、V8 Javascriptライブラリ(したがってChrome)がこれをサポートしていても驚かないでしょう。しかし、それに頼らないでください:)
これを試して:
matches = ['12', 'watt'];
[value, unit] = matches;
ES6は、これを array destructuring を介して直接サポートしています。
const matches = ['12', 'watt'];
const [value, unit] = matches;
これは、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;
}
}
CoffeeScript は、構文を使用した破壊代入を提供します。
[a, b] = someFunctionReturningAnArray()
これは、非常に新しいJavaScriptバージョンで提供される機能とほとんど同じです。ただし、CoffeeScriptはIE6のJavaScriptエンジンと互換性のあるコンパイル済みのJSを生成するため、互換性が不可欠な場合は適切なオプションです。
[〜#〜] phpjs [〜#〜] によるlist()
の実験的な実装があります:
https://github.com/kvz/phpjs/blob/master/_experimental/array/list.js
ほとんどの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"
これが私のハックです。私はそれを行う関数を書くことなくそれを得ることができる限り短い。ただし、「this」の範囲に注意してください。
list = ["a","b","c"];
vals = [1,2,3];
for(var i in vals)this[list[i]]=vals[i];
console.log(a,b,c);
笑いに十分です。私はまだ各変数を一度に1つずつ割り当てます。
a=vals[0];
b=vals[1];
c=vals[2];
この方法ははるかに短いです。さらに、変数の束を持っている場合、それらはおそらく配列に保持する必要があります。あるいは、それらをすべて個別に宣言するのではなく、クロージャーのプロパティにする必要があります。