Создать объект с ключами из списка JavaScript

183
28 мая 2022, 20:40

Есть следующий список:

let lst = ["km-m", "km-cm", "km-mm"]

На выходе необходимо получить словарь следующего типа:

let myDict = {
    "km-m": {
        "km": 0,
        "m": 0
    },
    "km-cm": {
        "km": 0,
        "cm": 0
    },
    "km-mm": {
        "km": 0,
        "mm": 0
    },
};

Пишу следующий цикл и не знаю как наполнить словарь

for(let i=0; i < joinList.length; i++) {
     let template = joinList[i].split('-');
     console.log(joinList[i]);
     Object.assign(convertData, {joinList[i]: 0});
 };

В цикле ощибка, не пойму почему нельзя поставить ключем lst[0] например. Прошу помочь исправить код или предложить альтернативное решение Спасибо!

Answer 1

{joinList[i]: 0} — так будет синтаксическая ошибка, потому что в качестве ключей объекта можно использовать или строки, или идентификаторы (т.е. то, что разрешено как имя переменной). Если вы хотите использовать в качестве ключей произвольные выражения (в том числе переменные), их нужно заключать в квадратные скобки: { [joinList[i]]: 0}. Тогда вычисленное значение выражения (или его строковой вариант, если результатом будет не строка) будет использовано в качестве ключа.

Можно так:

const lst = ["km-m", "km-cm", "km-mm"];
const obj = {};
for (const key of lst) {
  const subkeys = key.split('-');
  obj[key] = { [subkeys[0]]: 0, [subkeys[1]]: 0 };
}
console.log(obj);

Или так:

const lst = ["km-m", "km-cm", "km-mm"];
const obj = lst.reduce(
  (obj, key) => {
    const [subkey1, subkey2] = key.split('-');
    obj[key] = { [subkey1]: 0, [subkey2]: 0 };
    return obj;
  },
  {}
);
console.log(obj);

P.S. Создание словаря с параметрами:

const correlations = {
  km: {
    m:  1000,
    cm: 100000,
    mm: 1000000,
  },
}
const list = ['km-m', 'km-cm', 'km-mm'];
const number = 3;
console.log(getDic(number, list, correlations));
function getDic(number, list, correlations) {
  const obj = {};
  for (const key of list) {
    const [subkey1, subkey2] = key.split('-');;
    obj[key] = {
      [subkey1]: number,
      [subkey2]: number * correlations[subkey1][subkey2]
    };
  }
  return obj;
}

Answer 2

let lst = ["km-m", "km-cm", "km-mm"];
console.log(Object.fromEntries(lst.map(m=>[m,Object.fromEntries(m.split('-').map(s=>[s,0]))])));

READ ALSO
Создание веб приложения js

Создание веб приложения js

Есть задачаСоздать веб приложение которое будет получать данные из Яндекс метрики, яндекс директ, google analytics и google ads по api и формировать csv файл...

278
Заменить 5 replace на 1 regexp | JS

Заменить 5 replace на 1 regexp | JS

Очень мозолит глаза вот такая конструкция:

137