Объединить данные из массива объектов

Я получил эту структуру данных и проверяю, какие свойства верны, а затем добавляю key для всех свойств, которые соответствуют этому объекту, в новом свойстве с именем combined

const data = [
  {
    keyword: 'banana',
    yellow: true,
    sweet: true
  },
  {
    keyword: 'pineapple',
    yellow: true,
    sweet: false
  },
  {
    keyword: 'apple',
    yellow: false,
    sweet: false
  },
]

const combined = [...data].reduce((acc, { keyword, ...rest}) => {
  const res = Object.entries(rest).reduce((total, [key, value]) => {
    if (value === true) total.push(key)
    return total
  }, [])
  acc.push(res)
  return acc
}, []).map(entry => ({ combined: entry.join(' ') }))

const output = data.map((entry, index) => ({
  ...entry,
  ...combined[index]
}))

console.log(output)
.as-console-wrapper { max-height: 100% !important; top: 0; }

Это кажется довольно простым, но почему-то кажется немного запутанным

2 ответа
2

Из небольшого обзора;

  • Ваш собственный ответ лучше читается
  • map правильный подход
  • Я бы пошел на filter вместо reduce (вам нужны только «истинные» значения, которые не являются ключевыми словами)
  • Я бы, наверное, назвал total -> keys
  • я предпочитаю <verb><object> так combined -> addGroups
  • Если вы не используете ложное сравнение, вам не нужно проверять 'keyword'
const data = [
    {keyword: 'banana', yellow: true, sweet: true},
    {keyword: 'pineapple', yellow: true, sweet: false},
    {keyword: 'apple', yellow: false, sweet: false},
];

function addGroup(o){
  return {
    ...o,
    group: Object.keys(o).filter(key => o[key] === true).join(' ') 
  };
}

function addGroups(list){
  return list.map(o => addGroup(o));
}

console.log(addGroups(data))
.as-console-wrapper { max-height: 100% !important; top: 0; }

  • Спасибо за ответ, отлично работает. Любая причина, по которой вы не стали бы делать что-то более простое, например: const addGroups = (arr) => arr.map(obj => ({ ...obj, group: Object.keys(obj).filter(key => obj[key] === true).join(' ') }))

    — Альваро

Я улучшил это с помощью этого:

const data = [
  {
    keyword: 'banana',
    yellow: true,
    sweet: true
  },
  {
    keyword: 'pineapple',
    yellow: true,
    sweet: false
  },
  {
    keyword: 'apple',
    yellow: false,
    sweet: false
  },
]


const combined = [...data].map((entry) => {

  const group = Object.entries(entry).reduce((total, [key, value]) => {
    if (value && key !== 'keyword')  total.push(key)
    return total
  }, []).join(' ')

  return {
    ...entry,
    group
  }
})


console.log(combined)
.as-console-wrapper { max-height: 100% !important; top: 0; }

Это лучший подход?

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *