繁体   English   中英

访问嵌套对象属性并通过通用方法更新其值

[英]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.sub1student.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;
}

[说明]在执行功能签名后,我通过

  1. 用“。”分隔“路径字符串”。 因此获得一个数组以便在对象中导航。
  2. 使用keys创建一个循环并导航/验证对象,直到到达所需的道具为止-如果该对象的路径有效,则一切正常,否则循环停止并且该函数返回false。

我认为但您未提及的是函数返回的值-如果一切顺利,则返回true,否则返回false(没有propPath或对象“不正确”)。

希望能帮助到你。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM