Как сгладить массив в JS?

У меня есть следующие данные:

const data = [{
    ratings: [ { rating: 5 } ],
    counts: [ { count: 100 } ],
}];

И я хочу сгладить это в том смысле, что я хочу избавиться от массивов и иметь только объекты, а конечный результат будет:

const data = {
   ratings: { rating: 5 },
   counts: { count: 100 },
};

Я пытался сделать что-то подобное, но это неправильно, и я считаю, что слишком усложняю это.

const flatten = data => {
                return data.reduce((r, { ...children }) => {
                    Object.assign(children, r);
                    if (children) Object.assign(flatten(...Object.values(children)), r);
                    return r;
                }, {})
              }

Любые идеи?

Есть ли только один объект в каждом массиве?

Eddie 01.12.2018 14:28

@ Эдди Нет, у некоторых есть еще. Но в основном все массивы состоят из одного элемента, который сам по себе является объектом.

user9128740 01.12.2018 14:29
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
2
147
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вы можете создать рекурсивную функцию с методом reduce, чтобы превратить все массивы в объекты, если у вас есть только объекты в этих массивах.

const data = [{ratings: [ { rating: 5 } ],counts: [ { count: 100 } ]}];

function flatten(arr) {
  return arr.reduce((r, e) => {
    const obj = Object.assign({}, e);
    for (let p in obj) {
      if (Array.isArray(obj[p])) {
        obj[p] = flatten(obj[p])
      }
    }
    return Object.assign(r, obj)
  }, {})
}

console.info(flatten(data))

Пожалуйста, проверьте:

var data = [{ratings: [ { rating: 5 } ], counts: [ { count: 100 } ]}];

var flatten = function(data) {
  if (Array.isArray(data)) {
    data = data[0];
    for (var key in data) data[key] = flatten(data[key]);
  }
  return data;
}

console.info(flatten(data));

Пожалуйста, проверьте @ CodePen https://codepen.io/animatedcreativity/pen/842e17d2b9f83bc415513f937fc29be8

Если случайно данные получены из JSON.parse:

var json = JSON.stringify( [{ratings:[{rating: 5}], counts:[{count: 100}]}] )

var result = JSON.parse(json, (k, v) => v[0] || v)

console.info( result )

Другие вопросы по теме