Добавить значения в объект 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);