Как объединить свойства объекта с индексами массивов в их именах в единый массив?

У меня есть такой объект

var obj = {
  'Lorem': 'foo',
  'Ipsum[0]': 'bar',
  'Ipsum[1]': 'stuff',
  'Dolor[0][0]': 'foo',
  'Dolor[0][1]': 'bar',
  'Dolor[1][0]': 'stuff',
  'Dolor[1][1]': 'foo'
};

И я бы хотел превратить это в это

var obj = {
  'Lorem': 'foo',
  'Ipsum': ['bar', 'stuff'],
  'Dolor': [
    ['foo', 'bar'],
    ['stuff', 'foo']
  ]
};

Я откопал отсюда, что с .match(/[^\[\]]+/g) я могу получить значения между скобками, но я не могу понять, что с ними делать.

Кстати, 'Ipsum[0]': 'stuff', перезаписывает 'bar'.

Nina Scholz 16.03.2018 10:56

@NinaScholz Моя ошибка, отредактировано.

Nadroev 16.03.2018 11:06
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
2
46
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать регулярное выражение (я добавил точку для вложенных объектов) и сократить путь, пройдя данный объект. Если объект не существует, создайте новое свойство с именем или массивом. Позже присвойте значение.

function setValue(object, path, value) {
    var way = path.match(/[^\[\].]+/g),
        last = way.pop();

    way.reduce(function (o, k, i, kk) {
        return o[k] = o[k] || (isFinite(i + 1 in kk ? kk[i + 1] : last) ? [] : {});
    }, object)[last] = value;
}

var obj = { 'Lorem': 'foo', 'Ipsum[0]': 'bar', 'Ipsum[1]': 'stuff', 'Dolor[0][0]': 'foo', 'Dolor[0][1]': 'bar', 'Dolor[1][0]': 'stuff', 'Dolor[1][1]': 'foo' };

Object.keys(obj).forEach(function (k) {
    var v = obj[k];
    delete obj[k];
    setValue(obj, k, v);
});

console.info(obj);

Другие вопросы по теме