3

我有一个看起来像这样的对象的 json 数组:{id:'the id', name:'the name'};我需要遍历数组并按每个对象的名称属性按字母顺序对每个对象进行分组。有没有办法做到这一点,而不使用每个字母的 switch / if 语句?

我不想做的是这样的:

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

这是一个大数组,其中包含近 1,000 个对象。我的目标是最终将它们附加到潜水中,因此它看起来像这样:

4

  • 4品脱
  • 4块饼干

一种

  • 苹果
  • 亚历克斯
  • 亚当

  • 鲍勃
  • 比利
4

3 回答 3

9

您可以像这样遍历您的收藏:

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...}
于 2011-05-03T21:44:38.033 回答
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;
}
于 2011-05-03T21:46:13.263 回答
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));
于 2018-12-24T06:30:50.640 回答