Как построить массив объектов в уникальный массив объектов

У меня есть массив таких объектов

let data = 
[
    {
        text: 'label'
    },
    {
        text: 'username'
    },
    {
        text: 'category'
    },
    {
        text: 'book'
    },
    {
        text: 'john'
    },
    {
        text: 'education'
    },
    {
        text: 'car'
    },
    {
        text: 'doe'
    },
    {
        text: 'automotive'
    },
    {
        text: 'shoes'
    },
    {
        text: 'cena'
    },
    {
        text: 'fashion'
    },
]

и мой ожидаемый массив объектов

let result = 
[
    {
        label: 'book',
        username: 'john',
        category: 'education'
    },
    {
        label: 'car',
        username: 'doe',
        category: 'automotive'
    },
    {
        label: 'shoes',
        username: 'cena',
        category: 'fashion'
    },
]

Что вы пробовали до сих пор?

Code Maniac 17.11.2022 08:22

Я пробовал по модулю, и я все еще складываю для результата

noobier43 17.11.2022 08:31
Поведение ключевого слова "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
62
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Как насчет switch-case с оператором по модулю % для проверки текущего ключа:

const transformData = (data) => {
  let result = [];
  let tmpObj = {};
  data.forEach((element, idx) => {
    switch (idx % 3) {
      case 0:
        tmpObj["label"] = element.text;
        break;
      case 1:
        tmpObj["username"] = element.text;
        break;
      case 2:
        result.push({ ...tmpObj,
          category: element.text
        });
        tmpObj = {};
        break;
      default:
        break;
    }
  });
  return result;
};

console.info(transformData(getSampleData()));

function getSampleData() {
  return [{
      text: 'label'
    },
    {
      text: 'username'
    },
    {
      text: 'category'
    },
    {
      text: 'book'
    },
    {
      text: 'john'
    },
    {
      text: 'education'
    },
    {
      text: 'car'
    },
    {
      text: 'doe'
    },
    {
      text: 'automotive'
    },
    {
      text: 'shoes'
    },
    {
      text: 'cena'
    },
    {
      text: 'fashion'
    },
  ];
}

Я вижу, мне просто нужно больше условий для зацикливания, большое спасибо

noobier43 17.11.2022 08:32

Я был бы признателен за голосование, если бы этот ответ помог вам

sm3sher 17.11.2022 08:36

Согласно вашим данным, верхние 3 записи - это имя свойства, остальные - данные, поэтому мы можем использовать Array.slice(), чтобы получить имена свойств.

Затем мы можем использовать Array.reduce() для преобразования левых данных

let keys = data.slice(0,3).map(v => v.text)
let result = data.slice(3).reduce((a,c,i) =>{
  let key = keys[i%3]
  if (i%keys.length ==0){
   let obj = {}
   obj[key] = c.text
   a.push(obj)
  }else{
   a.at(-1)[key]=c.text
  }
  return a
},[])

console.info(result)

let data = 
[
    {
        text: 'label'
    },
    {
        text: 'username'
    },
    {
        text: 'category'
    },
    {
        text: 'book'
    },
    {
        text: 'john'
    },
    {
        text: 'education'
    },
    {
        text: 'car'
    },
    {
        text: 'doe'
    },
    {
        text: 'automotive'
    },
    {
        text: 'shoes'
    },
    {
        text: 'cena'
    },
    {
        text: 'fashion'
    },
]

let keys = Object.values(data.slice(0,3)).map(v => v.text)
let result = data.slice(3).reduce((a,c,i) =>{
  let key = keys[i%3]
  if (i%keys.length ==0){
   let obj = {}
   obj[key] = c.text
   a.push(obj)
  }else{
   a.at(-1)[key]=c.text
  }
  return a
},[])

console.info(result)
Ответ принят как подходящий

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

let data = [{ text: 'label' }, { text: 'username' }, { text: 'category' }, { text: 'book' }, { text: 'john' }, { text: 'education' }, { text: 'car' }, { text: 'doe' }, { text: 'automotive' }, { text: 'shoes' }, { text: 'cena' }, { text: 'fashion' },];

const size = 3;
const result = [];

for (let temp, i = size; i < data.length; i++) {
  if (i % size === 0) {
    result.push(temp = {});
  }
  temp[data[i % size].text] = data[i].text;
}

console.info(result)

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