Как установить значение свойства объекта JavaScript? - PullRequest
0 голосов
/ 19 октября 2018

У меня есть объект JavaScript, который выглядит примерно так:

obj = {
  person: {
    male: true,
    age: 10
  },
  state: {
    quit: false,
    rain: -3
  },
  game: {
     settings: {
       lang: 'en',
       os: 'win',
       ver: 10,
     },
  },
  next: 55,
  last: 10,
};

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

function updateObj( property /*: string[]*/, value /*: any*/ ) {

  obj[property[0]][property[1]] = value;  <-- How to generalize? 

}

Итак, я могу сделать что-то вроде:

updateObj( ['person', 'male'], false );
updateObj( ['state', 'rain'], 19 );

Однако текущая реализация не будет работать должным образом, если длина параметра свойства не равна 2. Как эта строка кода:

  obj[property[0]][property[1]] = value;

обобщить для работы с любым размером массива свойства?

Ответы [ 3 ]

0 голосов
/ 19 октября 2018

Итерируйте по частям свойства и для каждой из них получите вложенный объект:

function updateObj( property /*: string[]*/, value /*: any*/ ) {
    var base = obj;
    for (var i = 0; i < property.length - 1; i++) {
        base = base[property[i]];
    }
    base[property[property.length - 1]] = value;
}
0 голосов
/ 19 октября 2018

Вы можете сохранить последний ключ и уменьшить объект, взяв ключи и вернув ссылку на последний объект.Для не указанных свойств назначьте пустой объект.

В конце возьмите последний ключ и присвойте значение.

function updateObj(properties, value) {
    var last = properties.pop();
    properties.reduce((o, k) => o[k] = o[k] || {}, obj)[last] = value;
}

var obj = { person: { male: true, age: 10 }, state: { quit: false, rain: -3 }, game: { settings: { lang: 'en', os: 'win', ver: 10 }, }, next: 55, last: 10 };

updateObj(['person', 'male'], false);
updateObj(['state', 'rain'], 19);
updateObj(['banana', 'ware'], 'snakeoil');


console.log(obj);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 19 октября 2018

Ниже приведен метод достижения вашего результата, используется reduRight ниже

// with reduceRight
function updateObj(prop, value) {
    prop  = prop.reverse()
    prop.reduceRight((o, d, i) => i == 0 ? (o[d] = value): o[d] , obj)
}

// with Reduce (efficient than above)
function updateObj(prop, value) {
    prop.reduce((o, d, i) => i == prop.length -1 ? (o[d] = value): o[d] , obj) 
}

updateObj( ['person', 'male'], false );
updateObj( ['state', 'rain'], 19 );
...