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

jda*_*vis 174 javascript

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

var DepartmentFactory = function(data) {
    this.id = data.Id;
    this.name = data.DepartmentName;
    this.active = data.Active;
}
Run Code Online (Sandbox Code Playgroud)

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

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}));
Run Code Online (Sandbox Code Playgroud)

所以我现在将创建一个由对象创建的对象数组DepartmentFactory.我如何使用该array.sort()方法按DepartmentName每个对象的属性对这个对象数组进行排序?

array.sort()排序字符串数组时,该方法可以正常工作

var myarray=["Bob", "Bully", "Amy"];
myarray.sort(); //Array now becomes ["Amy", "Bob", "Bully"]
Run Code Online (Sandbox Code Playgroud)

但是如何使它与对象列表一起使用?

Ome*_*ari 300

你必须做这样的事情:

objArray.sort(function(a, b) {
    var textA = a.DepartmentName.toUpperCase();
    var textB = b.DepartmentName.toUpperCase();
    return (textA < textB) ? -1 : (textA > textB) ? 1 : 0;
});
Run Code Online (Sandbox Code Playgroud)

注意:更改大小写(向上或向下)可确保不区分大小写的排序.

  • 我们可以将其简化为 return textA.localeCompare(textB); (8认同)
  • 我已经回答了你的答案 50 亿次,因为我永远不记得如何做到这一点。FWIW,我的 Linter 总是告诉我“表达式周围的无偿括号”:`return (textA &lt; textB) ?-1 : (textA &gt; textB) ? 1 : 0;` 不会编辑你的答案,希望我至少会记住 linting 的事情:) (4认同)

ron*_*mbe 137

支持unicode:

objArray.sort(function(a, b) {
   return a.DepartmentName.localeCompare(b.DepartmentName);
});
Run Code Online (Sandbox Code Playgroud)

  • 对于不区分大小写的版本,请在第2行使用以下命令:`return a.DepartmentName.toLowerCase().localeCompare(b.DepartmentName.toLowerCase());` (6认同)
  • 每天学习新东西-localeCompare很棒,并且对第一个arg具有所有浏览器支持。不错! (2认同)
  • @BenBarreth没有理由小写字符串。localeCompare的重点是将管理排序逻辑和语言环境怪癖的工作分流到系统中。如果对语言环境进行区分大小写的排序是正常的(如英语一样),则将为您完成:`“ Z”&gt;'a'// false'“ Z” .localeCompare('a')/ / 1`如果您希望偏离语言环境的默认设置,则可以在`locales`和`options`参数中发送替代:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference / Global_Objects / String / localeCompare#Parameters (2认同)

Nei*_*eil 14

objArray.sort((a, b) => a.DepartmentName.localeCompare(b.DepartmentName))
Run Code Online (Sandbox Code Playgroud)


小智 13

使用 ES6 缩短代码

objArray.sort((a, b) => a.DepartmentName.toLowerCase().localeCompare(b.DepartmentName.toLowerCase()))
Run Code Online (Sandbox Code Playgroud)


Dio*_*ode 12

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

// use `new DepartmentFactory` as given below. `new` is imporatant

var objArray = [];
objArray.push(new DepartmentFactory({Id: 1, DepartmentName: 'Marketing', Active: true}));
objArray.push(new DepartmentFactory({Id: 2, DepartmentName: 'Sales', Active: true}));
objArray.push(new DepartmentFactory({Id: 3, DepartmentName: 'Development', Active: true}));
objArray.push(new DepartmentFactory({Id: 4, DepartmentName: 'Accounting', Active: true}));

function sortOn(property){
    return function(a, b){
        if(a[property] < b[property]){
            return -1;
        }else if(a[property] > b[property]){
            return 1;
        }else{
            return 0;   
        }
    }
}

//objArray.sort(sortOn("id")); // because `this.id = data.Id;`
objArray.sort(sortOn("name")); // because `this.name = data.DepartmentName;`
console.log(objArray);
Run Code Online (Sandbox Code Playgroud)

演示:http://jsfiddle.net/diode/hdgeH/


bob*_*bob 7

// Sorts an array of objects "in place". (Meaning that the original array will be modified and nothing gets returned.)
function sortOn (arr, prop) {
    arr.sort (
        function (a, b) {
            if (a[prop] < b[prop]){
                return -1;
            } else if (a[prop] > b[prop]){
                return 1;
            } else {
                return 0;   
            }
        }
    );
}

//Usage example:

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

// ------- make -------
sortOn(cars, "make");
console.log(cars);

/* OUTPUT:
AMC         : Pacer : 1978
Koenigsegg  : CCGT  : 2011
Pagani      : Zonda : 2006
*/



// ------- model -------
sortOn(cars, "model");
console.log(cars);

/* OUTPUT:
Koenigsegg  : CCGT  : 2011
AMC         : Pacer : 1978
Pagani      : Zonda : 2006
*/



// ------- year -------
sortOn(cars, "year");
console.log(cars);

/* OUTPUT:
AMC         : Pacer : 1978
Pagani      : Zonda : 2006
Koenigsegg  : CCGT  : 2011
*/
Run Code Online (Sandbox Code Playgroud)


小智 7

objArray.sort( (a, b) => a.id.localeCompare(b.id, 'en', {'sensitivity': 'base'}));
Run Code Online (Sandbox Code Playgroud)

这会按字母顺序对它们进行排序,并且不区分大小写。它也超级干净且易于阅读:D


Kri*_*oyd 7

因为这里提供的所有解决方案都没有空/未定义的安全操作,所以我以这种方式处理(您可以根据需要处理空值):

ES5

objArray.sort(
  function(a, b) {
    var departmentNameA = a.DepartmentName ? a.DepartmentName : '';
    var departmentNameB = b.DepartmentName ? b.DepartmentName : '';

    return departmentNameA.localeCompare(departmentNameB);
  }
);
Run Code Online (Sandbox Code Playgroud)

ES6+

objArray.sort(
 (a: DepartmentFactory, b: DepartmentFactory): number => {
   const departmentNameA = a.DepartmentName ? a.DepartmentName : '';
   const departmentNameB = b.DepartmentName ? b.DepartmentName : '';

   return departmentNameA.localeCompare(departmentNameB);
 }
);
Run Code Online (Sandbox Code Playgroud)

我还删除了其他人使用的 toLowerCase,因为 localeCompare 不区分大小写。另外,我更喜欢在使用 Typescript 或 ES6+ 时对参数更加明确,以便对未来的开发人员来说更加明确。


qwe*_*ymk 5

演示

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

var objArray = [];
objArray.push(new DepartmentFactory({Id: 1, DepartmentName: 'Marketing', Active: true}));
objArray.push(new DepartmentFactory({Id: 2, DepartmentName: 'Sales', Active: true}));
objArray.push(new DepartmentFactory({Id: 3, DepartmentName: 'Development', Active: true}));
objArray.push(new DepartmentFactory({Id: 4, DepartmentName: 'Accounting', Active: true}));

console.log(objArray.sort(function(a, b) { return a.name > b.name}));
Run Code Online (Sandbox Code Playgroud)