Реконструировать объект на основе имени ключа

avatar
Filippo854
8 августа 2021 в 18:51
29
1
0

У меня есть, скажем, этот объект

const data = {
    'name-pl': 'something pl',
    'name-en': 'something en',
    'name-de': 'something de',
    'content-pl': 'some content pl',
    'content-en': 'some content en',
    'content-de': 'some content de',
    category: 'animals',
  };

И этот массив

const array = ['name', 'content']

Теперь на основе значений в массиве я хочу реконструировать этот объект в это:

const data = {
    name:{
      pl: 'something pl',
      en: 'something en',
      de: 'something de',
    },
    content:{
      pl:'some content pl',
      en:'some content en',
      de:'some content de',
    },
    category: 'animals'
  }

Итак, если значение в массиве совпадает с ключом в исходном объекте, это происходит, есть ли способ сделать это?

Источник

Ответы (1)

avatar
lejlun
8 августа 2021 в 19:00
2

Это можно сделать с помощью цикла for...in и array#includes,

  • Пройтись по каждому ключу объекта,
  • Разделить ключ на две части,
  • Если первая часть находится в array, создайте новый подобъект с его именем и поместите внутрь него вторую часть.
  • Если нет, оставьте все как есть и двигайтесь дальше.

Демо:

const data = {
  'name-pl': 'something pl',
  'name-en': 'something en',
  'name-de': 'something de',
  'content-pl': 'some content pl',
  'content-en': 'some content en',
  'content-de': 'some content de',
  category: 'animals',
};

const array = ['name', 'content']

let result = {}

for (let key in data) {
  let [prefix, suffix] = key.split("-")
  if (array.includes(prefix)) {
    result[prefix] =  {...result[prefix], [suffix]: data[key]}
  }
  else {
    result[key] = data[key]
  }
}

console.log(result)