Javascript按字母顺序分组

时间:2011-05-03 21:29:55

标签: javascript yui yui3

我有一个json数组的对象看起来像这样:{id:'the id', name:'the name'};我需要循环遍历数组并按名称属性按字母顺序对每个对象进行分组。有没有办法在不使用带有每个字母的switch / if语句的情况下执行此操作?

我不想做的事情是这样的:

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

它是一个大型数组,其中包含近1,000个对象。我的目标是最终让他们潜水,所以它看起来像这样:

4

  • 4品脱
  • 4个饼干

A

  • 苹果
  • 亚历
  • 亚当

  • 鲍勃
  • 比利

3 个答案:

答案 0 :(得分:8)

你可以像这样查看你的馆藏:

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 :(得分:1)

冒泡排序将为您完成这项工作。例如:

// 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;
}

答案 2 :(得分:1)

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