如果我有一个所需属性的路径数组,如何设置对象的属性?

时间:2014-11-19 19:14:37

标签: javascript arrays object javascript-objects

var obj = {
  people: {
    John: {
      pets:{
        dog:{
          name:"Umbrella",
          age:12
        },
        cat:{
          name:"Kitty",
          age:5
        }
      }
    }
  }
};
var path=['people', 'John', 'pets', 'cat', 'name'];
var newName='Train';

如何设置数组想要的对象(现在它是猫的名字)?阵列可以改变,所以我不能手工编写。我需要一个函数来自动执行,具体取决于数组

3 个答案:

答案 0 :(得分:0)

递归使用以下函数

foreach(var key in obj)
{
console.log('key'); //gives the key name like - people, John, Pets, dog, cat etc.,
}

答案 1 :(得分:0)

你可以使用像这样的递归函数:

var prop = function (obj, chain) {
    if (obj && chain.length > 0) {
        return prop(obj[chain[0]], chain.slice(1));
    }
    return obj;
};

prop(obj, path);

甚至是迭代函数:

var prop = function (obj, chain) {
    var i = 0;
    while (obj && i < chain.length) {
        obj = obj[chain[i]];
        i++;
    }
    return obj;
};

prop(obj, path);

编辑:要设置值,您可以执行以下操作:

var set = function (obj, chain, value) {
    if (obj === undefined || obj === null) return;
    var i = 0;
    while (obj[chain[i]] !== undefined && obj[chain[0]] !== null && i < chain.length - 1) {
        obj = obj[chain[i]];
        i++;
    }
    obj[chain[i]] = value;
};

set(obj, path, 'Train');

答案 2 :(得分:0)

使用for循环:

var cursor = obj;

for (var i = 0, len = path.length; i < len; i++) {
    cursor = cursor[path[i]];
}