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']);

如果要获取对象引用,只需指定第二个参数即可:

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

另一种方法可能是使用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 回答
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 回答