2011-11-18 140 views
0

我正在创建一个提供get()和set()函数以从JavaScript对象读取和更新值的功能。诀窍是我使用点符号字符串来指定属性。动态更新/创建对象属性

我已经get()工作正常,它是set(),我遇到了麻烦。

的样本数据:

var data = { 
    person: { 
     name: 'Fred', 
     birthday: '19840101', 
     address: { 
      street: '123 Main St.', 
      city: 'Anytown', 
      state: 'NY', 
      zip: '123123' 
     }, 
     family: { 
      spouse: 'Sally', 
      children: ['Sam', 'Frank', 'Susan'] 
     } 
    } 
}; 

的get()函数:

function get (path) { 
    var parts = path.split('.'), 
     tmp = data; 
    for (var i = 0, l = parts.length; i < l; ++i) { 
     if (tmp[parts[i]]) { 
      tmp = tmp[parts[i]]; 
     } 
     else { 
      tmp = null 
      break; 
     } 
    } 
    return tmp; 
} 

console.log(get('person.name')); // Fred 
console.log(get('person.family.children')); // ['Sam', 'Frank', 'Susan'] 
console.log(get('person.jobs.apple')); // null 

set()函数:

var foo = null; 
function set (path, val) { 
    var parts = path.split('.') 
     tmp = {}, 
     foo = data; 

    for (var i = 0, l = parts.length; i < l; ++i) { 
     if (tmp[parts[i]]) { 
      tmp = data[parts[i]]; 
     } 
     else { 
      tmp = {}; 
     } 
     if (i+1 === l) { 
      tmp = val; 
     } 
     data[parts[i]] = tmp; 
    } 
} 

set('person.name', 'Dave'); // replace existing name 
set('person.family.children', ['Tim', 'Matt', 'Kathy']); // replace existing array 
set('person.jobs.apple', 'developer'); // should create the necessary properties 
console.log(data); 

我结束了以下对象:

obj = { 
    person: {}, 
    name: "Dave", 
    family: {}, 
    children: ["Tim","Matt","Kathy"], 
    jobs: {}, 
    apple: "developer" 
} 

有关如何完成此任何想法?

回答

2

根本不需要任何功能。

看到这个

var data = { 
    person: { 
     name: 'Fred', 
     birthday: '19840101', 
     address: { 
      street: '123 Main St.', 
      city: 'Anytown', 
      state: 'NY', 
      zip: '123123' 
     }, 
     family: { 
      spouse: 'Sally', 
      children: ['Sam', 'Frank', 'Susan'] 
     } 
    } 
}; 

alert(data.person.name); 
data['person']['name'] = 'Tim'; 
alert(data['person']['name']); 

还有这个答案可以帮助

Javascript object key value coding. Dynamically setting a nested value

+0

目的是不提供给主叫方,因此get()和()设置。我为了说明的目的添加了它。感谢您的链接,但是...希望它能解决我的问题! –

+0

虽然你的代码没有解决我的问题,但链接确实如此。谢谢! –

0

看起来您的set代码中有一些拼写错误。

该行tmp = data[parts[i]];应该确实是tmp = tmp[parts[i]];。 然后你可能想将它放入一个新的变量 - 比如说,newTmp, - 使你可以在以后分配给它回对象:

tmp[parts[i]] = newTmp; 
    tmp = newTmp; 
0

你的问题似乎是数据[零件[I] ] = tmp;在设置函数结束时。