Учитывая массив
const array = [{
typeName: 'welcome', orientation: 'landscape', languageId: 1, value: 'Welcome'
}, {
typeName: 'welcome', orientation: 'landscape', languageId: 2, value: 'Bonjour'
}, {
typeName: 'welcome', orientation: 'portrait', languageId: 2, value: 'Bonjour bonjour'
}]
Моя конечная цель состоит в том, чтобы получить это:
{
welcome: {
landscape: ['Welcome'],
portrait: ['Bonjour bonjour']
}
}
Для этого мне нужно преобразовать в объект типа {typeName: {orientation: value[]}}
, например так:
// This is NOT what I want, it's just an intermediate form -- keep reading
{
welcome: {
landscape: ['Welcome', 'Bonjour'],
portrait: ['Bonjour bonjour']
}
}
Но включая расстановку приоритетов: если languageId = 1 присутствует в массиве, тогда игнорировать остальные значения для указанных c typeName, direction..В приведенном выше примере должно быть только ['Welcome'] , поскольку его languageId = 1, поэтому 'Bonjour' можно игнорировать, хотя, если languageId = 1 отсутствует, тогда может быть добавлено любое значение (welcome.portrait).
С конвертацией я не столкнулся с какими-либо проблемами. Думаю, .reduce () метод
array.reduce((prev, current) => ({
...prev,
[current.typeName]: {
...prev[current.typeName],
[current.orientation]: [
...(((prev[current.typeName] || {})[current.orientation]) || []),
current.value
]
}
}), {});
, но приоритизацию я могу сделать только с фильтрацией, которая также l oop внутри него .. Пока проблем нет, но если массив будет довольно большим - производительность пострадает
const array = [{
typeName: 'welcome', orientation: 'landscape', languageId: 1, value: 'Welcome'
}, {
typeName: 'welcome', orientation: 'landscape', languageId: 2, value: 'Bonjour'
}, {
typeName: 'welcome', orientation: 'portrait', languageId: 2, value: 'Bonjour bonjour'
}]
const result = array
.filter((item) => {
return item.languageId === 1 ||
!array.some((innerItem) => ( //Inner loop that I want to avoid
innerItem.typeName === item.typeName &&
innerItem.orientation === item.orientation &&
innerItem.languageId === 1
))
})
.reduce((prev, current) => ({
...prev,
[current.typeName]: {
...prev[current.typeName],
[current.orientation]: [
...(((prev[current.typeName] || {})[current.orientation]) || []),
current.value
]
}
}), {});
console.log(result)
Итак, вопрос в том, как лучше всего избегать внутреннего l oop?