Javascript динамически инициализирует вложенную карту некоторыми значениями массива

#javascript

Вопрос:

Я пытаюсь динамически сгенерировать карту следующего формата на основе пользовательских данных:

 {
  Jane: {
    Comments: ["Hello", "Hi"]
  },
  John: {
    Age: "999",
    Comments: "Hi"
  }
}
 

Ключи, значения и гнезда находятся во время выполнения, поэтому изначально все, что я буду знать, это то, что структура верхнего уровня — это карта. Я попытался сделать это во время выполнения, используя приведенный ниже код.

 var nest = function(map, keys, v) {
    if (keys.length === 1) {
          map[keys[0]] = v;
    } else {
      var key = keys.shift();
      map[key] = nest(typeof map[key] === 'undefined' ? {} : map[key], keys, v);
    }

    return map;
};

var persons = new Map();
// Usage 
nest(persons, ['John', 'Comments'], 'Hi');
nest(persons, ['John', 'Age'], '999');

nest(persons, ['Jane', 'Comments'], 'Wow');
nest(persons, ['Jane', 'Comments'], 'Hello');

console.log(persons);
 

Однако он перезаписывает значение Comments вместо того, чтобы создавать его в виде массивов.
Может кто-нибудь, пожалуйста, помочь мне с созданием этой вложенной карты без перезаписи со значениями массива? (Примечание: любые другие значения, кроме комментариев, не являются массивами)

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

Комментарии:

1. Во-первых, вы не можете получить доступ к свойствам карты , используя обозначение в скобках, вам нужно использовать методы set and get . Возможно, вы имели в виду использовать объект ?

Ответ №1:

Вы можете использовать Array#reduce для получения вложенной Map , после чего вы можете установить ключ.

 var nest = function(map, keys, v) {
    const lastKey = keys.pop(), innerMap = keys.reduce((acc, key)=>{
      if(!acc.has(key)) acc.set(key, new Map);
      return map.get(key);
    }, map);
    if(lastKey !== 'Comments') innerMap.set(lastKey, v);
    else {
      if(!innerMap.has(lastKey)) innerMap.set(lastKey, []);
      innerMap.get(lastKey).push(v);
    }
};

var persons = new Map();
// Usage 
nest(persons, ['John', 'Comments'], 'Hi');
nest(persons, ['John', 'Age'], '999');

nest(persons, ['Jane', 'Comments'], 'Wow');
nest(persons, ['Jane', 'Comments'], 'Hello');

console.log(persons); // Check browser console