Установка глубокого ключа объекта JS с помощью строки поиска

1

Как установить глубокие свойства в объекте 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]'
    }
}
  • 0
    Я полагаю, что вам придется вручную присваивать значения, перебирая lookup_string.split('.')
  • 0
    Возможный дубликат: stackoverflow.com/questions/6393943/…
Теги:
object

2 ответа

2
Лучший ответ

Вы можете разделить 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; }
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]'
        }
    };

Ещё вопросы

Сообщество Overcoder
Наверх
Меню