0

次のようなJSリテラルオブジェクトがあるとします。

var foo = {
    _stuff : {
        a:10,
        b:20,
        c:30,
        state
    }
}

およびリテラル関数

addAB: function() {
    add(foo._stuff[a], foo._stuff[b]);
}

addAC: function() {
    add(foo._stuff[a], foo._stuff[c]);
}

add: function(bar, baz) {
    foo._stuff[bar] += foo._stuff[baz];
    state(foo._stuff[bar]);
}

state: function(value) {
   foo.state[value] = .... something complex ....
}

1回のパスで次のものを取得するにはどうすればよいですか?

add(AB); foo._stuff[a] should be 30, foo.state[foo._stuff[a]] is something new
add(AC); foo._stuff[a] should be 40, foo.state[foo._stuff[a]] is something new

add()は、foo._stuff [10]を検索しようとしますが、これは明らかに私が望むことを実行しません。

はい、addAB()とaddAC()に冗長性があることは知っていますが、それは私の制御の及ばないものです。

4

3 に答える 3

2

次のように、値の代わりにインデックスを渡します。

addAB: function() {
    add('a', 'b');
}

addAC: function() {
    add('a', 'c');
}
于 2012-12-31T21:52:24.167 に答える
0
add: function(bar, baz) {
    if (arguments.length === 1) {
        this['add' + arguments[0]];
    } else {
      foo._stuff[bar] += foo._stuff[baz];
      state(foo._stuff[bar]);
    }
}

// assuming you are calling
var AB = 'AB', AC = 'AC';
add(AB); 
add(AC);

そうでなければ、私はあなたが何を求めているのか見当がつかない。

于 2012-12-31T21:52:33.227 に答える
0

あなたが達成したいことを完全に実行するかどうかはわかりませんが、オブジェクトリテラルは有効な構文ではありません。なぜあなたがその_stuff物件を欲しがっているのか分かりません。stateまた、プロパティが未定義の場合でも、プロパティを何らかの値に初期化する必要があります。stateただし、プロパティ名に基づいてプロパティに値を格納する必要stateがあるため、オブジェクトになるように初期化する必要があります。

var foo = {
    a:10,
    b:20,
    c:30,
    state: {}
}

あなたのJavaScript:

addAB: function() {
    add('a', 'b');
}

addAC: function() {
    add('a', 'c');
}

add: function(propName0, propName1) {
    foo[propName0] += foo[propName1];
    state(propName0);
}

state: function(propName) {
    // state is initialized to an object, so can store properties in there now
   foo.state[propName] = .... something complex ....
}
于 2012-12-31T21:55:53.917 に答える