Отсортируйте массив объектов в алфавитном порядке и удалите дубликаты

#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);