JavaScript - Свести массив вложенных объектов - PullRequest
0 голосов
/ 25 августа 2018

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

Входящие данные:

results = [
  {
    surveyValues: [
      { id: 135, name: 'First Name', value: 'Jim' },
      { id: 136, name: 'Last Name', value: 'Jones' },
      { id: 137, name: 'City', value: 'Fredsburg' },
    ],
  },
  {
    surveyValues: [
      { id: 135, name: 'First Name', value: 'Greg' },
      { id: 136, name: 'Last Name', value: 'Jones' },
      { id: 137, name: 'City', value: 'Waverly' },
    ],
  },
];

Желаемый результат:

output = [
  {
    id: 1, FirstName: 'Jim', LastName: 'Jones', City: 'Fredsburg',
  },
  {
    id: 2, FirstName: 'Greg', LastName: 'Jones', City: 'Waverly',
  },
];

Моя текущая попытка заставляет меня размещать обновленные пары ключ / значение в правильном порядке, но создает огромный массив отдельных объектов.

Текущий код:

const results = [];

surveyResults.map(s => s.surveyValues)
  .forEach(s => Object.entries(s)
  .forEach(([key, value]) => {
    Object.entries(value)
      .forEach(([k, v]) => {
        if (k === 'name') {
          results.push({
            id: value.id,
            [v]: value.value.toString(),
          });
        }
    });
}));

Текущий вывод кода:

[
  {
    id: 135, FirstName: 'Jim',
  },
  {
    id: 136, LastName: 'Jones',
  },
  {
    id: 137, City: 'Fredsburg',
  },
  {
    id: 135, FirstName: 'Greg',
  },
  {
    id: 136, LastName: 'Jones',
  },
  {
    id: 137, City: 'Waverly',
  },
]

Чего мне не хватает, и почему мой код не создал новые массивы объектов по желанию?

Ответы [ 2 ]

0 голосов
/ 25 августа 2018

Создайте каждый объект во внешнем цикле map() и добавьте к нему свойства во внутреннем forEach().

surveyResults = [
  {
    surveyValues: [
      { id: 135, name: 'First Name', value: 'Jim' },
      { id: 136, name: 'Last Name', value: 'Jones' },
      { id: 137, name: 'City', value: 'Fredsburg' },
    ],
  },
  {
    surveyValues: [
      { id: 135, name: 'First Name', value: 'Greg' },
      { id: 136, name: 'Last Name', value: 'Jones' },
      { id: 137, name: 'City', value: 'Waverly' },
    ],
  },
];

const results = surveyResults.map((s, i) => {
  let v = s.surveyValues;
  let obj = {id: i};
  v.forEach(item => obj[item.name.replace(/\s+/g, "")] = item.value.toString());
  return obj;
});

console.log(results);
0 голосов
/ 25 августа 2018

Вы можете использовать map и reduce для этого. Я также обращаюсь к индексу i в обратном вызове функции карты, чтобы установить свойство id, и string.replace(), чтобы убрать пробел из клавиш FirstName и LastName.

const results = [
  {
    surveyValues: [
      { id: 135, name: 'First Name', value: 'Jim' },
      { id: 136, name: 'Last Name', value: 'Jones' },
      { id: 137, name: 'City', value: 'Fredsburg' },
    ],
  },
  {
    surveyValues: [
      { id: 135, name: 'First Name', value: 'Greg' },
      { id: 136, name: 'Last Name', value: 'Jones' },
      { id: 137, name: 'City', value: 'Waverly' },
    ],
  },
];


const result = results.map((e, i) => 
  e.surveyValues.reduce((a, e) => {
    a[e.name.replace(" ", "")] = e.value;
    return a;
  }, {id: i + 1})
);

console.log(result);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...