Javascript алфавитная группировка - PullRequest
1 голос
/ 04 мая 2011

У меня есть массив объектов json, который выглядит следующим образом: {id:'the id', name:'the name'};, и мне нужно перебрать массив и сгруппировать каждый объект в алфавитном порядке по его атрибуту имени. Есть ли способ сделать это без использования оператора switch / if с каждой буквой в нем?

То, что я не хочу делать, это что-то вроде этого:

if(data[i].name..slice(0, 1) == 'a') {
   ...
}

Это большой массив, в котором почти 1000 объектов. Моя цель в конечном итоге добавить их в погружение, чтобы оно выглядело примерно так:

4

  • 4 пинты
  • 4 печенья

A

  • Apple
  • Alex
  • Адам

B

  • Bob
  • Билли

Ответы [ 3 ]

8 голосов
/ 04 мая 2011

вы можете просматривать свои коллекции следующим образом:

var groupedCollection = {};   
for(...){//loop throug collection         
    var firstLetter = data[i].charAt(0);
    if(groupedCollection[firstLetter] == undefined){             
        groupedCollection[firstLetter] = [];         
    }         
    groupedCollection[firstLetter].push(data[i]);     
}
//groupedCollection now contait data in the form of {a: [], b:[], etc...}
1 голос
/ 24 декабря 2018

ES7 синтаксис

const sortAndGroup = async () => {
  const sortedData = data.sort();
  const reducedData = sortedData.reduce((items, dataElement) => {
    if (!items.find(item => item.header === dataElement.charAt(0))) {
      items.push({ header: dataElement.charAt(0) });
    }
    items.push({ name: dataElement });
    return items;
  }, []);
  return reducedData.map(item => item.header || item.name);
};


sortAndGroup().then(result => console.log(result));
1 голос
/ 04 мая 2011

Bubble sort сделает эту работу за вас.Пример:

// sample array
var myArr = [
    {id:"00", name:"Billy"},
    {id:"00", name:"Apple"},
    {id:"00", name:"4 biscuits"},
    {id:"00", name:"Adam"},
    {id:"00", name:"Alex"},
    {id:"00", name:"4 pints"},
    {id:"00", name:"Bob"}
];

// standard bubble sort algorithm
function bubbleSortByName(arr) {
    for (var x = 0; x < arr.length; x++) {
        for(var y = 0; y < arr.length-1; y++) {
            // compare arr[].name.toLowerCase() i.e. b > a
            if(arr[y].name.toLowerCase() > arr[y+1].name.toLowerCase()) {
                var tmp = arr[y+1];
                arr[y+1] = arr[y];
                arr[y] = tmp;
            }
        }
    }
    return arr; 
}

// sort the array
var sortedArr = bubbleSortByName(myArr);

// print the results
for (var i=0; i<sortedArr.length; i++)
    document.write(sortedArr[i].name+"<br/>");

Или та же идея с алгоритмом сортировки вставкой:

// standard insertion sort algorithm
function insertionSortByName(arr) {
    for(var j = 1; j < arr.length; j++) {
        var key = arr[j];
        var i = j - 1;

        while(i >= 0 && arr[i].name.toLowerCase() > key.name.toLowerCase()) {
            arr[i+1] = arr[i];
            i = i - 1;     
        }            

        arr[i+1] = key;
    }

    return arr;
}
...