Получите доступ к свойству вложенного объекта и обновите его значение с помощью универсального метода - PullRequest
0 голосов
/ 27 мая 2018

Я хочу создать универсальный метод, который будет обращаться к свойству вложенного объекта и обновлять его значение, переданное в качестве аргумента.

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
}

Я ссылался на эту ссылку, но это только вернет мне значение

Ответы [ 3 ]

0 голосов
/ 27 мая 2018

[Немедленное решение] Я хотел бы предложить что-то вроде:

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 или если объект «неправильный»).

Надеюсь, это поможет.

0 голосов
/ 27 мая 2018

Вы можете сделать это с помощью метода 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)
0 голосов
/ 27 мая 2018

Вы на правильном пути.Я хотел бы пойти дальше и сделать это так.Таким образом, вы можете передать массив значения, которое хотите изменить (т.е. ['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'));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...