#javascript #html #arrays #reactjs
Вопрос:
Так что у меня есть array
objects
что-то вроде:
[
{ letter: 'A', title: 'All' },{ letter: 'B', title: 'Business' },
{ letter: 'G', title: 'Cor' },
{ letter: 'G', title: 'Car' },
]
Как я могу отсортировать его так, чтобы он выглядел так:
[
{ letter: 'A', title: 'All' },
{ letter: 'B', title: 'Business' },
{ letter: 'G', title: 'Cor', 'Car' },
]
Комментарии:
1. Пожалуйста, предоставьте достаточно кода, чтобы другие могли лучше понять или воспроизвести проблему.
Ответ №1:
Что-то вроде этого сработало бы
const original = [
{ letter: 'A', title: 'All' },
{ letter: 'B', title: 'Business' },
{ letter: 'G', title: 'Cor' },
{ letter: 'G', title: 'Car' },
];
const map = {};
original.forEach(({letter, title}) => {
if(!Object.hasOwnProperty.call(map, letter)) map[letter] = {letter, title: [title]};
else {
map[letter]?.title.push(title);
}
});
console.debug(Object.values(map));
Ответ №2:
Вы можете использовать Array.sort()
для сортировки входного массива по буквам, а затем использовать Array.reduce()
вместе с Map
объектом для группировки входных данных по буквам:
const input = [
{ letter: 'Z', title: 'Title Z' },
{ letter: 'A', title: 'All' },
{ letter: 'B', title: 'Business' },
{ letter: 'G', title: 'Cor' },
{ letter: 'G', title: 'Car' },
];
const sortedInput = input.sort(({ letter: a},{ letter: b}) => a.localeCompare(b));
const result = [...sortedInput.reduce((acc, { letter, title }) => {
return acc.set(letter, { letter, title: [...(acc.get(letter)?.title || []), title] } );
}, new Map()).values()];
console.log('Result:', result)
.as-console-wrapper { max-height: 100% !important; top: 0; }
Ответ №3:
Вы можете сделать sort
следующее filter
.
const data = [{
letter: 'A',
title: 'All'
}, {
letter: 'B',
title: 'Business'
}, {
letter: 'G',
title: 'Cor'
}, {
letter: 'A',
title: 'Car'
}];
data.sort(function (a, b) {
if (a.letter < b.letter) {
return -1;
}
if (a.letter > b.letter) {
return 1;
}
return 0;
})
const result = data.filter((v, i, a) => a.findIndex(t => (t.letter === v.letter)) === i)
console.log(result)
Ответ №4:
Вы можете сначала отсортировать, а затем уменьшить массив.
const
data = [{ letter: 'A', title: 'All' }, { letter: 'B', title: 'Business' }, { letter: 'G', title: 'Cor' }, { letter: 'G', title: 'Car' }],
result = data
.sort((a, b) => a.letter.localeCompare(b.letter))
.reduce((r, o) => {
if (r[r.length - 1]?.letter === o.letter) r[r.length - 1].title = ', ' o.title;
else r.push({ ...o });
return r;
}, []);
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Ответ №5:
let arr = [
{ letter: "A", title: "All" },
{ letter: "G", title: "Car" },
{ letter: "B", title: "Business" },
{ letter: "G", title: "Cor" },
{ letter: "A", title: "All" },
];
arr.sort((a, b) => a.letter.localeCompare(b.letter));
var result = arr.reduce((unique, o) => {
if(!unique.some(obj => obj.letter === o.letter )) {
unique.push(o);
}
return unique;
},[]);
console.log("unique and sorted arr: ", result);