[英]Access nested object property and update its value through Generic method
我想创建一个通用方法,该方法将访问嵌套的对象属性并更新作为参数传递的值。
This is my data structure
var student = {
name: 'Tom',
address: {
pincode: 43301,
street: '12th Main',
city: 'Some city',
},
marks: {
sub1: 111,
sub2: 222
}
}
这是我通用方法的框架
updatProperty(student, 'marks.sub1', 125) {
// this method should return student object with marks.sub1 to be 125
}
您可以使用reduce方法执行此操作,在该方法中,检查当前值是否存在以及字符串键的长度是否等于当前元素,然后更改值。
var student = {"name":"Tom","address":{"pincode":43301,"street":"12th Main","city":"Some city"},"marks":{"sub1":111,"sub2":222}} function updatProperty(obj, key, value) { key.split('.').reduce((r, e, i, a) => { if (r[e] && a.length - 1 == i) r[e] = value return r[e] || {} }, obj) } updatProperty(student, 'marks.sub1', 125); console.log(student)
您走在正确的轨道上。 我会继续这样做。 这样,您就可以传递要更改的值(即['marks', 'sub1']
)的数组,它将更改您想要的任何值。 请参阅下面的示例,说明如何更改student.marks.sub1
和student.address.city
:
var student = { name: 'Tom', address: { pincode: 43301, street: '12th Main', city: 'Some city', }, marks: { sub1: 111, sub2: 222 } } function updateProperty(student, keys, value) { obj = student; for(var i=0; i<keys.length-1; i++){ obj = obj[keys[i]]; } obj[keys[i]] = value; return student; } console.log(updateProperty(student, ['marks', 'sub1'], 125)); console.log(updateProperty(student, ['address', 'city'], 'New York'));
[立即解决方案]我建议如下:
function updatProperty(obj, propPath, value) {
if(!propPath) return false;
const keys = propPath.split('.');
let pointer = obj,
validPath = true;
for (let i = 0; i < keys.length && validPath; i++) {
let key = keys[i];
if(i === (keys.length - 1)) pointer[key] = value;
else {
if(!pointer[key]) validPath = false;
else pointer = pointer[key];
}
}
return validPath;
}
[说明]在执行功能签名后,我通过
keys
创建一个循环并导航/验证对象,直到到达所需的道具为止-如果该对象的路径有效,则一切正常,否则循环停止并且该函数返回false。 我认为但您未提及的是函数返回的值-如果一切顺利,则返回true,否则返回false(没有propPath
或对象“不正确”)。
希望能帮助到你。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.