Я получил эту структуру данных и проверяю, какие свойства верны, а затем добавляю 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 ответа
Из небольшого обзора;
- Ваш собственный ответ лучше читается
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 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; }Это лучший подход?

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