0

配列を使用してオブジェクトに到達し、値を設定するにはどうすればよいですか?できればevalを使用せずに、次のようなことを行いobject[eval(["key", "deepkey"].split("")) = "newvalue"ますか?

手動で行うと、私はそれを行うだけですがobject.key.deepkey = "newvalue"、ここでも、配列を使用してこれを行い、適切なプロパティに到達する必要があります。

参照用のオブジェクト:

object = {
  key: {
    deepKey: "value"
  }
}
4

4 に答える 4

2

配列型の構文は次のように記述できます。jsfiddle

object = {
  key: {
    deepKey: "value"
  }
}

object['key']['deepkey']='newvalue'

配列にキーがある場合は、これを行うことができます

var keys = ['key','deepkey'];
var obj = object;
for(var k =0; k <keys.length-1; k++){
   obj= obj[keys[k]];
}
obj[keys[k]] = 'newvalue'
于 2012-10-14T12:31:44.127 に答える
2

再帰関数を使用して、次のように配列(またはオブジェクト)の各レベルをステップスルーできます。

function val(array, indices) {
    if(indices.length > 1) {
        var idx = indices.shift();
        return val(array[idx], indices);
    }
    else {
        return array[indices.shift()];
    }
}

var obj = { a: { b: 'c' } };

//result is 'c'
var result = val(obj, ['a', 'b']);

オブジェクト参照を取得する場合は、それまでの2番目の引数を指定するだけです。

var obj = {
    a: {
        b: {
            c: 'foo'
        }
    }
};

var ref = val(obj, ['a', 'b']);

//ref is now obj.a.b, so you can do something like...
ref.x = 'bar';

console.dir(ref); //outputs something like { c: 'foo', x: 'bar' }
于 2012-10-14T12:39:28.283 に答える
0

この質問から関数を取得し、それを作り直してオブジェクトのプロパティにアクセスできます。

http://jsfiddle.net/jbabey/Mu4rP/

var getPropByName = function (propName, context) {
    var namespaces = propName.split('.');

    for(var i = 0; i < namespaces.length; i++) {
        context = context[namespaces[i]];
    }

    return context;
};

var myObject = {
    someKey: {
        deepKey: "value"
    }
};

myObject.someKey.deepKey; // "value"
getPropByName('someKey.deepKey', myObject); "value"
于 2012-10-14T12:42:09.527 に答える
0

Array.map別の方法として、次の方法を使用することもできます。

function deepkey(obj,keys,set){
  var i=1
     ,kys = keys.split('.')
     ,exist = kys.map( function(k){
          var prev = this[i-1], isobj = prev.constructor === Object;
          this.push( isobj && k in prev ? prev[k] : prev);
          return (i++,this[i-1]);},
          [obj]
        )
     ,x = exist[exist.length-2];
  if (x && x.constructor === Object && set){
    x[kys[kys.length-1]] = set;
  }
  return x[kys.pop()] || null;
} 
// usage
var obj = { a:{ b:{ c:1, cc:{ d:{ e:{ a:1,b:2,c:3 } } } } } };
// assign [1,2,3,4,5] to obj.a.b.cc.d.e.b
console.log(deepkey(obj,'a.b.cc.d.e.b',[1,2,3,4,5])); //=> [1,2,3,4,5]
// get obj.a.b.cc.d.e.b[2]
console.log(deepkey(obj,'a.b.cc.d.e.b')[2]); //=> 3
// get non existing path obj.a.b.c.d.e.b
console.log(deepkey(obj,'a.b.c.d.e.b')); //=> null
于 2012-10-14T13:23:02.287 に答える