3

ドット表記の文字列を指定するオブジェクト リテラルをチェック/アクセスするソリューションはたくさんありますが、ドット表記の文字列に基づいてオブジェクト リテラルを設定する必要があります。なぜこれを行う必要があるのか​​ は非常に技術的であり、それが実現できない場合は、別の解決策を考え出します.

これが私がやりたいことです:

var obj = { 
   'a': 1, 
   'b': 2, 
    'c': { 
      'nest': true 
    } 
};

次のように機能する関数が欲しいです:

setDepth(obj, 'c.nest', false);

これにより、obj が次のように変更されます。

var obj = { 
   'a': 1, 
   'b': 2, 
    'c': { 
      'nest': false
    } 
};

私は1時間試してみましたが、まだ良い解決策を思いつくことができませんでした. 別の助けをいただければ幸いです。

4

4 に答える 4

6

私のバージョン:

function setDepth(obj, path, value) {
    var tags = path.split("."), len = tags.length - 1;
    for (var i = 0; i < len; i++) {
        obj = obj[tags[i]];
    }
    obj[tags[len]] = value;
}

作業デモ: http: //jsfiddle.net/jfriend00/Sxz2z/

于 2012-04-20T21:44:46.943 に答える
2

これはそれを行う1つの方法です:

function setDepth(obj, path, value) {
    var levels = path.split(".");
    var curLevel = obj;
    var i = 0;
    while (i < levels.length-1) {
        curLevel = curLevel[levels[i]];
        i++;
    }
    curLevel[levels[levels.length-1]] = value;
}

動作デモ。

于 2012-04-20T20:58:15.653 に答える
0

次のようにしてください:

new Function('_', 'val', '_.' + path + ' = val')(obj, value);

あなたの場合:

var obj = { 
   'a': 1, 
   'b': 2, 
    'c': { 
      'nest': true 
    } 
};

new Function('_', 'val', '_.c.nest' + ' = val')(obj, false);
于 2015-04-11T10:08:02.867 に答える