1

次のオブジェクトがあるとしましょう:

dict = { a: 1, b: 2, c: 3 }

以下は完全に機能します:

{a, b} = dict
// -> a = 1
// -> b = 2

これらの数値を操作してオブジェクトに書き戻したいのですが、明らかに次の行は機能しません。

// some manipulations
dict = {a, b}

dict明らかに、オブジェクトを上書きしました。私が本質的にやりたかったのは、割り当てdict.a = aて、そのdict.b = bままdict.cにしておくことです。

ある種の短い表記法で私の目標を達成することは可能ですか?

4

3 に答える 3

4

以下を使用して、オブジェクトのスライスを個別のローカル変数に抽出できます。

{a, b} = dict

ただし、オブジェクトのスライスに割り当てる方法はありません。つまり、次のようなことはできません。

dict{a, b} = [ x, y ]

のショートカットとして

dict.a = x
dict.b = y

次のようなものでは、オブジェクト スライスを新しいオブジェクトに抽出することさえできません。

obj = dict{a, b}

次の 2 つの手順で行う必要があります。

{ a, b } = dict
obj      = { a, b }

構造化されていない割り当ては、オブジェクトから何かを引き出すのにはうまく機能しますが、オブジェクトに何かを戻すのにはあまり役に立ちません。あなたが得ることができる最も近いのは、非構造化配列の割り当てを使用することだと思います:

[ dict.a, dict.b ] = [ a, b ]

複数のキーを使用している場合は、キーを配列に入れて、ループでスライスとマージを行うことができます (ヘルパー関数でラップされている可能性があります)。

slice = (obj, keys...) ->
    s = { }
    s[k] = obj[k] for k in keys
    s

merge = (dest, src) ->
    dest[k] = src[k] for k of src
    return

keys = [ 'a', 'b' ]
dict = { a: 1, b: 2, c: 3 }
s = slice(dict, keys...)
s.a += 6
s.b += 6
merge(dict, s)
# dict is now { a: 7, b: 8, c: 3 }

または、Underscore、jQuery、... ユーティリティ関数を使用するだけです。

于 2012-11-28T20:29:26.520 に答える
0

あなたがunderscore.jsを使用していると仮定すると、私はこれを行います:

dict = { a: 1, b: 2, c: 3 }
{a, b} = dict
...
dict = _.extend dict, {a:a, b:b}

asawyerが指摘しているように、jQueryにも同様の拡張関数があります。

于 2012-11-28T19:44:55.607 に答える