web-dev-qa-db-ja.com

タプルからのJavaScript変数の割り当て

Python 2およびPython 3)のような言語では、値を定義してTuple変数に割り当て、次のように値を取得できます。

Tuple = ("Bob", 24)
name, age = Tuple
print(name)           #name evaluates to Bob
print(age)            #age evaluates to 24

JavaScriptに類似したものはありますか?または、配列を使用してい方法でそれを行う必要がありますか?

Tuple = ["Bob", 24]
name = Tuple[0]       //name Evaluates to Bob
age = Tuple[1]        //age Evaluates to 24

JavaScript 5でPythonタプルをシミュレートするより良い方法はありますか?

83
Karl

あなたはitい方法でそれをしなければなりません。あなたが本当にこのようなものを望むなら、 CoffeeScript をチェックアウトすることができます。 python(広告のように聞こえるかもしれませんが、本当に気に入っています。)

48
Gabi Purcaru

Javascript 1.7が追加されました 破壊された割り当て

function getTuple(){
   return ["Bob", 24];
}
var [a, b] = getTuple();
// a === "bob" , b === 24 are both true
99
pc1oad1etter

同様のことができます:

var Tuple = Object.freeze({ name:'Bob', age:14 })

そして、属性として名前と年齢を参照します

Tuple.name 
Tuple.age 
27

この「タプル」機能は、EcmaScript2015ではデストラクタリングと呼ばれ、すぐに最新のブラウザーでサポートされる予定です。とりあえず、 FirefoxとChromeサポートのみ

ただし、 transpiler を使用できます。

コードはpythonと同じように見えます:

let Tuple = ["Bob", 24]
let [name, age] = Tuple

console.log(name)
console.log(age)
26
Adrian

凍結された配列は、python Tuple:

const Tuple = Object.freeze(["Bob", 24]);
let [name, age]; = Tuple
console.debug(name); // "Bob"
console.debug(age); // 24

凝ってクラスを定義する

class Tuple extends Array { 
  constructor(...items) { 
    super(...items); 
    Object.freeze(this);
  } 
}

let Tuple = new Tuple("Jim", 35);
let [name, age] = Tuple;
console.debug(name); // Jim
console.debug(age); // 35
Tuple = ["Bob", 24]; // no effect 
console.debug(name); // Jim
console.debug(age); // 25

現在、すべての最新ブラウザで動作します。

9

JavaScriptではタプルはサポートされていません

不変リストを探している場合は、Object.freeze()を使用して配列を不変にすることができます。

Object.freeze()メソッドはオブジェクトをフリーズします。つまり、新しいプロパティが追加されないようにします。既存のプロパティが削除されないようにします。既存のプロパティ、またはその列挙可能性、構成可能性、書き込み可能性が変更されるのを防ぎます。本質的に、オブジェクトは事実上不変になります。このメソッドは、凍結されているオブジェクトを返します。

出典: Mozilla Developer Network-Object.freeze()

通常どおり配列を割り当てますが、 'Object.freeze()を使用してロックします

> Tuple = Object.freeze(['Bob', 24]);
[ 'Bob', 24 ]

通常の配列と同じように値を使用します(Pythonのマルチ割り当てはサポートされていません)

> name = Tuple[0]
'Bob'
> age = Tuple[1]
24

新しい値を割り当てようとする

> Tuple[0] = 'Steve'
'Steve'

しかし、値は変更されません

> console.log(Tuple)
[ 'Bob', 24 ]
5
Evan Plaice

残念ながら、(ECMA | Java)ScriptでそのTuple割り当て構文を使用することはできません。

編集:誰かがMozilla/JS 1.7にリンクしました-これはクロスブラウザでは動作しませんが、それが必要でなければ、あなたの答えがあります。

5
meder omuraliev

これは、実際の生活で実際に使用することを意図したものではなく、単に興味深い演習です。詳細については、「 なぜJavaScript eval関数を使用するのは悪い考えですか? 」を参照してください。

これは、ベンダー固有の拡張機能に頼ることなく取得できる最も近いものです。

myArray = [1,2,3];
eval(set('a,b,c = myArray'));

ヘルパー関数:

function set(code) {
    var vars=code.split('=')[0].trim().split(',');
    var array=code.split('=')[1].trim();
    return 'var '+vars.map(function(x,i){return x+'='+array+'['+i+']'}).join(',');
}

任意のスコープで動作することの証明:

(function(){
    myArray = [4,5,6];
    eval(set('x,y,z = myArray'));
    console.log(y);  // prints 5
})()

evalはSafariではサポートされていません。

3
ninjagecko

大臣の回答の更新として、es2015でこれを行うことができます。

function Tuple(...args) {
  args.forEach((val, idx) => 
    Object.defineProperty(this, "item"+idx, { get: () => val })
  )
}


var t = new Tuple("a", 123)
console.log(t.item0) // "a"
t.item0 = "b"
console.log(t.item0) // "a"

https://jsbin.com/fubaluwimo/edit?js,console

3
Zach Dahl

JavascriptでTuple型を使用することもできます。高階関数で定義するだけです(学術用語は教会のエンコーディングです):

const Tuple = (...args) => {
  const Tuple = f => f(...args);
  return Object.freeze(Object.assign(Tuple, args));
};

const get1 = tx => tx((x, y) => x);

const get2 = tx => tx((x, y) => y);

const bimap = f => g => tx => tx((x, y) => Tuple(f(x), g(y)));

const toArray = tx => tx((...args) => args);

// aux functions

const inc = x => x + 1;
const toUpperCase = x => x.toUpperCase();

// mock data

const pair = Tuple(1, "a");

// application

console.assert(get1(pair) === 1);
console.assert(get2(pair) === "a");

const {0:x, 1:y} = pair;
console.log(x, y); // 1 a

console.log(toArray(bimap(inc) (toUpperCase) (pair))); // [2, "A"]

const map = new Map([Tuple(1, "a"), Tuple(2, "b")]);
console.log(map.get(1), map.get(2)); // a b

Tupleは通常のコンストラクターとして使用されないことに注意してください。ソリューションは、プロトタイプシステムにまったく依存せず、高次関数のみに依存します。

タプルのように使用されるArraysに対するタプルの利点は何ですか?教会でエンコードされたタプルは設計上不変であるため、突然変異によって引き起こされる副作用を防ぎます。これにより、より堅牢なアプリケーションを構築できます。さらに、コレクションタイプとしてArraysを区別するコード(たとえば、[a])およびさまざまなタイプの関連データとしてのタプル(例:(a, b))。

2
user6445533

次に、簡単なJavascript Tuple実装を示します。

var Tuple = (function () {
   function Tuple(Item1, Item2) {
      var item1 = Item1;
      var item2 = Item2;
      Object.defineProperty(this, "Item1", {
          get: function() { return item1  }
      });
      Object.defineProperty(this, "Item2", {
          get: function() { return item2  }
      });
   }
   return Tuple;
})();

var Tuple = new Tuple("Bob", 25); // Instantiation of a new Tuple
var name = Tuple.Item1; // Assignment. name will be "Bob"
Tuple.Item1 = "Kirk"; // Will not set it. It's immutable.

これは2タプルですが、3、4、5、6などのタプルをサポートするように私の例を変更できます。

1
Faris Zacina
[a, b, c] = [2, 'momo', 7]  // b === 'momo', c ===7 ...
0
drordk