Перестройте структуру объекта JavaScript - PullRequest
0 голосов
/ 08 октября 2019

Я хочу изменить структуру объекта, и я застрял со вчерашнего дня, поэтому мне нужна ваша важная помощь.

В настоящее время структура выглядит следующим образом:

var data = [{
    id: 14,
    language: "english",
    title: "I am a new article",
    bodyText: "Article Content",
    lang: "eng",
    keywords: ["key1", "key2"]
  },
  {
    id: 1,
    language: "greeks",
    title: "Ειμαι ενα καινουρειο αρθρο",
    bodyText: "Κυριο μερος Αρθρου",
    lang: "gr",
    keywords: ["key1", "key2"]
  },
  {
    id: 1,
    language: "espanol",
    title: "Soy un nuevo articulo",
    bodyText: "Soy un nuevo articulo",
    lang: "es",
    keywords: ["key1", "key2"]
  },

]

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

var data = [{
  id: 1,
  language: {
    es: {
      title: "Spanish Article",
      bodyText: "Content in Spanish"
    },
    gr: {

      title: "Greek Article",
      bodyText: "Content in Grecce"
    }
  },
  id: 2,
  language: {
    en: {
      title: "English Article",
      bodyText: "Content in English"
    }
  }
}];

Я написал следующий код для выполнения задачи, но без удачи.

var arr = [];
let result = data.reduce(function(c, v) {
  console.log(v.id);
  /*   console.log(c);
   */
  c[v.id] = c[v.id] || {};
  c[v.id][v.lang] = c[v.id][v.lang] || {
    title: v.title,
    bodyText: v.bodyText,
    keywords: v.keywords
  };
  arr.push(c)
  return c;
}, {});
console.log(arr);

Я получаю объект, подобный следующему:

[{
id:1,
es:{
title:"Spanish Article",
bodyText:"Content in Spanish"
},
gr:{
title:"Greek Article",
bodyText:"Content in Grecce"
},
id:2,
en:{
title:"English Article",
bodyText:"Content in English"
}
}]

Любая рекомендация приветствуется, заранее спасибо сообществу!

Ответы [ 2 ]

2 голосов
/ 08 октября 2019

Ваша целевая модель данных кажется немного неоптимальной, потому что у вас есть массив с уникальными идентификаторами, которые могут быть более производительными в качестве объекта с идентификатором в качестве ключей, но вы также можете обойтись без своей модели данных:

var data = [
  {
    id: 14,
    language: "english",
    title: "I am a new article",
    bodyText: "Article Content",
    lang: "eng",
    keywords: ["key1", "key2"]
  },
  {
    id: 1,
    language: "greeks",
    title: "Ειμαι ενα καινουρειο αρθρο",
    bodyText: "Κυριο μερος Αρθρου",
    lang: "gr",
    keywords: ["key1", "key2"]
  },
  {
    id: 1,
    language: "espanol",
    title: "Soy un nuevo articulo",
    bodyText: "Soy un nuevo articulo",
    lang: "es",
    keywords: ["key1", "key2"]
  }
];
  
console.log(data.reduce(function(result, entry) {
  var id_index = result.map(function(e) { return e.id; }).indexOf(entry.id);
  var id_element;
  
  if (id_index === -1) {
    id_element = {id: entry.id, language: {}};
  } else {
    id_element = result[id_index];
  }
  
  id_element.language[entry.lang] = {
    title: entry.title,
    bodyText: entry.bodyText
  };
  
  if (id_index === -1) {
    result.push(id_element);
  }
  
  return result;
}, []))
1 голос
/ 08 октября 2019

Вы можете деструктурировать свойства и позже использовать значения из хеш-таблицы.

Основная часть заключается в получении исходного объекта со свойством language.

var data = [{ id: 14, language: "english", title: "I am a new article", bodyText: "Article Content", lang: "eng", keywords: ["key1", "key2"] }, { id: 1, language: "greeks", title: "Ειμαι ενα καινουρειο αρθρο", bodyText: "Κυριο μερος Αρθρου", lang: "gr", keywords: ["key1", "key2"] }, { id: 1, language: "espanol", title: "Soy un nuevo articulo", bodyText: "Soy un nuevo articulo",     lang: "es", keywords: ["key1", "key2"] }],
    result = data.reduce((c, { id, lang, title, bodyText, keywords }) => {
        c[id] = c[id] || { id, language: {} };
        c[id].language[lang] = { title, bodyText, keywords };
        return c;
    }, {}),
    array = Object.values(result);

console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...