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

IT技术 javascript
2021-01-13 04:51:36

假设你有一个这样的 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"]

但是我如何使它与对象列表一起工作?

6个回答

你必须做这样的事情:

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

注意:更改大小写(为大写或小写)可确保不区分大小写的排序。

我们可以简化它以返回 textA.localeCompare(textB);
2021-03-25 04:51:36
我已经回答你 50 亿次了,因为我永远不记得如何做到这一点。FWIW,我的 Linter 总是告诉我“表达式周围的无偿括号”:return (textA < textB) ? -1 : (textA > textB) ? 1 : 0;不会编辑你的答案,希望我至少会记住 linting 的事情:)
2021-04-03 04:51:36
发现此代码有问题。使用小写和大写字母的组合。前任。credit_card_no 和 City。该代码确实对列表进行了排序,但以 'c' 开头的单词没有组合在一起。
2021-04-03 04:51:36

支持 unicode:

objArray.sort(function(a, b) {
   return a.DepartmentName.localeCompare(b.DepartmentName);
});
@BenBarreth 没有理由小写字符串。重点localeCompare是将管理排序逻辑和区域设置怪癖的工作分流到系统中。如果对区域设置进行不区分大小写的排序是正常的,就像在英语中一样,这将为您完成: "Z" > 'a' // false "Z".localeCompare('a') // 1 如果您希望偏离区域设置的默认值,您可以在localesoptions参数中发送覆盖developer.mozilla。 org/en-US/docs/Web/JavaScript/Reference/...
2021-03-23 04:51:36
请记住,这不是空安全的,在运行之前需要检查“DepartmentName”是否是实际字符串,否则排序将因空指针异常而失败。
2021-03-23 04:51:36
对于不区分大小写的版本,请在第 2 行使用以下内容: return a.DepartmentName.toLowerCase().localeCompare(b.DepartmentName.toLowerCase());
2021-03-28 04:51:36
每天学习新东西 -localeCompare很酷,并且所有浏览器都支持第一个 arg。不错!
2021-04-10 04:51:36

使用 ES6 缩短代码

objArray.sort((a, b) => a.DepartmentName.toLowerCase().localeCompare(b.DepartmentName.toLowerCase()))
objArray.sort((a, b) => a.DepartmentName.localeCompare(b.DepartmentName))
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);

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