Как установить глубокие свойства в объекте JavaScript с помощью строки точечного синтаксиса, чтобы указать, какое свойство я хочу изменить?
Для простых объектов я мог бы просто использовать data['property_name'] = 'foo'
, но я не обязательно знаю, насколько глубоко вложены данные.
Ниже приведен пример кода с тем, как я хотел бы иметь возможность форматировать данные в конце. Для всех, кого я знаю, есть хороший способ, которым JS уже позволяет вам это делать, но я еще не смог его найти.
var items = [
{
lookup_string: "User.UserProfile.name",
value: "John Smith"
},
{
lookup_string: "User.email",
value: "[email protected]"
},
]
var data = {};
items.forEach(function(item){
// Inside this loop, set the appropriate keys under data. Is there a non-convoluted way to do this?
});
console.log("items", items);
console.log("Results", data)
// In the end, data should look like this:
var desiredData = {
User: {
UserProfile: {
name: 'John Smith'
},
email: '[email protected]'
}
}
Вы можете разделить lookup_string
и уменьшить объект с объектом по умолчанию. Позже назначьте значение.
function setValue(object, path, value) {
var keys = path.split('.'),
last = keys.pop();
keys.reduce(function (o, k) {
return o[k] = o[k] || {};
}, object)[last] = value;
}
var items = [{ lookup_string: "User.UserProfile.name", value: "John Smith" }, { lookup_string: "User.email", value: "[email protected]" }],
object = {};
items.forEach(function(o) {
setValue(object, o.lookup_string, o.value);
});
console.log(object);
.as-console-wrapper { max-height: 100% !important; top: 0; }
вам придется перебирать все ключи из lookup_string.split('.') и присваивать значения, например:
var items = [
{
lookup_string: "User.UserProfile.name",
value: "John Smith"
},
{
lookup_string: "User.email",
value: "[email protected]"
},
];
var data = {};
items.forEach(function(item){
var lookup = item.lookup_string.split('.');
var lastKey;
lookup.map(function(key){
data[key] = {};
lastKey = key;
});
data[lastKey] = item.value;
});
console.log("items", items);
console.log("Results", data)
// In the end, data should look like this:
var desiredData = {
User: {
UserProfile: {
name: 'John Smith'
},
email: '[email protected]'
}
};
lookup_string.split('.')