按数组中一个属性的字母顺序对对象进行排序

349

假设你有一个像这样的JavaScript类

var DepartmentFactory = function(data) {
    this.id = data.Id;
    this.name = data.DepartmentName;
    this.active = data.Active;
}

假设你创建了该类的多个实例并将它们存储在一个数组中

var objArray = [];
objArray.push(DepartmentFactory({Id: 1, DepartmentName: 'Marketing', Active: true}));
objArray.push(DepartmentFactory({Id: 2, DepartmentName: 'Sales', Active: true}));
objArray.push(DepartmentFactory({Id: 3, DepartmentName: 'Development', Active: true}));
objArray.push(DepartmentFactory({Id: 4, DepartmentName: 'Accounting', Active: true}));
所以我现在有一个由DepartmentFactory创建的对象数组。我该如何使用array.sort()方法按每个对象的DepartmentName属性对这个对象数组进行排序? array.sort()方法在对字符串数组排序时工作得非常好。
var myarray=["Bob", "Bully", "Amy"];
myarray.sort(); //Array now becomes ["Amy", "Bob", "Bully"]

但是如何让它适用于对象列表?


你可以将一个排序函数作为第一个参数传递给 .sort()。 - Paul Tomblin
2
由于您正在使用DepartmentFactory作为构造函数,请使用new DepartmentFactory创建其对象,否则数组将填充一堆undefined值。 - Anurag
14个回答

1

这里有一个简单的函数,可以通过对象属性对数组进行排序;不管属性是字符串类型还是整数类型,它都可以正常工作。

    var cars = [
        {make:"AMC",        model:"Pacer",  year:1978},
        {make:"Koenigsegg", model:"CCGT",   year:2011},
        {make:"Pagani",     model:"Zonda",  year:2006},
    ];

    function sortObjectsByProp(objectsArr, prop, ascending = true) {
        let objectsHaveProp = objectsArr.every(object => object.hasOwnProperty(prop));
        if(objectsHaveProp)    {
            let newObjectsArr = objectsArr.slice();
            newObjectsArr.sort((a, b) => {
                if(isNaN(Number(a[prop])))  {
                    let textA = a[prop].toUpperCase(),
                        textB = b[prop].toUpperCase();
                    if(ascending)   {
                        return textA < textB ? -1 : textA > textB ? 1 : 0;
                    } else {
                        return textB < textA ? -1 : textB > textA ? 1 : 0;
                    }
                } else {
                    return ascending ? a[prop] - b[prop] : b[prop] - a[prop];
                }
            });
            return newObjectsArr;
        }
        return objectsArr;
    }

    let sortedByMake = sortObjectsByProp(cars, "make"); // returns ascending order by its make;
    let sortedByYear = sortObjectsByProp(cars, "year", false); // returns descending order by its year,since we put false as a third argument;
    console.log(sortedByMake);
    console.log(sortedByYear);


-3

在尝试了一下并尽可能减少循环次数后,我最终得出了这个解决方案:

Codepen上的演示

const items = [
      {
        name: 'One'
      },
      {
        name: 'Maria is here'
      },
      {
        name: 'Another'
      },
      {
        name: 'Z with a z'
      },
      {
        name: '1 number'
      },
      {
        name: 'Two not a number'
      },
      {
        name: 'Third'
      },
      {
        name: 'Giant'
      }
    ];

    const sorted = items.sort((a, b) => {
      return a[name] > b[name];
    });

    let sortedAlphabetically = {};

    for(var item in sorted) {
      const firstLetter = sorted[item].name[0];
      if(sortedAlphabetically[firstLetter]) {
        sortedAlphabetically[firstLetter].push(sorted[item]);
      } else {
        sortedAlphabetically[firstLetter] = [sorted[item]]; 
      }
    }

    console.log('sorted', sortedAlphabetically);

-4
一个简单的答案:
objArray.sort(function(obj1, obj2) {
   return obj1.DepartmentName > obj2.DepartmentName;
});

ES6 的方式:

objArray.sort((obj1, obj2) => {return obj1.DepartmentName > obj2.DepartmentName};

如果您需要将其转换为小写/大写等,请执行该操作并将结果存储在变量中,然后比较该变量。示例:
objArray.sort((obj1, obj2) => {
   var firstObj = obj1.toLowerCase();
   var secondObj = obj2.toLowerCase();
   return firstObj.DepartmentName > secondObj.DepartmentName;
});

-4

你需要传递一个接受两个参数、比较它们并返回一个数字的函数,所以假设你想按ID排序,你会这样写...

objArray.sort(function(a,b) {
    return a.id-b.id;
});
// objArray is now sorted by Id

7
他询问的是按DepartmentName而不是Id排序。 - Paul Tomblin
我尝试过这个方法,但似乎在字符串列上不起作用... 它在日期列上有效。有效的是@omer-bokhari提供的解决方案。 - tsando

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接