Добавить значения в объект JS

Всем привет. Нужно добавить значения в объект.

Проблема в следующем: если попытаться добавить значение в объект, в котором уже есть поля, они перезапишутся.

Из трех кейсов не могу добить последний. Проблема: затирается объект test2. Что можно исправить?

Заранее спасибо.

var obj = {
  keyOne: "foo",
  keyTwo: {
    test1: "baz",
    test2: {
      test21: ["bar"],
    }
  }
}

function setObjectProperty(obj, string, value) {
  var path = string.split('.');
  var currentObj = obj;
  for (var i = 0; i < path.length - 1; i++) {
    if (!currentObj[path[i]] || currentObj[path[i]] != "string") {
      currentObj[path[i]] = {};
      currentObj = currentObj[path[i]];
    }
  }
  currentObj[path[path.length - 1]] = value;
};

setObjectProperty(obj, 'keyOne', 'new');
setObjectProperty(obj, 'keyOne.key.key2', 'newnew');
setObjectProperty(obj, 'keyTwo.test1', 'zzz');

console.log(obj);

P.S. Данный вопрос частично решается тут, код был взят за основу.

Установить объекту значение по строке типа "key.key2.key3"


Ответы (1 шт):

Автор решения: Ordman

Пробуем решить рекурсивно:

var obj = {
  keyOne: "foo",
  keyTwo: {
    test1: "baz",
    test2: {
      test21: ["bar"],
    }
  },
  keyThree: 'qux'
};

function setObjectProperty(obj, string, value) {
  let tmp = string.split('.');
  for (let i of tmp) {
    let s = tmp.filter(e => e !== i);
    if (typeof obj[i] === 'object' && tmp.length > 1) {
      obj[i] = setObjectProperty(obj[i], s.join('.'), value);
      break;
    } else if (typeof obj[i] === 'undefined' || tmp.length > 1) {
      obj[i] = s.length > 0 ? setObjectProperty({}, s.join('.'), value) : value;
      break;
    } else {
      obj[i] = value;
      break;
    }
  };

  return obj;

}

setObjectProperty(obj, 'keyThree', 'new');
setObjectProperty(obj, 'keyOne.key.key2', 'newnew');
setObjectProperty(obj, 'keyTwo.test1', 'zzz');

console.log(obj);

→ Ссылка