繁体   English   中英

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

[英]Sort objects in an array alphabetically on one property of the array

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

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

你必须做这样的事情:

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

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

支持unicode:

objArray.sort(function(a, b) {
   return 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/

objArray.sort((a, b) => a.DepartmentName.localeCompare(b.DepartmentName))

使用 ES6 缩短代码

objArray.sort((a, b) => a.DepartmentName.toLowerCase().localeCompare(b.DepartmentName.toLowerCase()))
// 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
*/
objArray.sort( (a, b) => a.id.localeCompare(b.id, 'en', {'sensitivity': 'base'}));

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

演示

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

像这样做

objArrayy.sort(function(a, b){
 var nameA=a.name.toLowerCase(), nameB=b.name.toLowerCase()
 if (nameA < nameB) //sort string ascending
  return -1
 if (nameA > nameB)
  return 1
 return 0 //default return value (no sorting)
});
console.log(objArray)

这是一个简单的函数,可用于通过对象的属性对对象数组进行排序; 属性是字符串类型还是整数类型都没有关系,它会起作用。

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

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

ES5

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

    departmentNameA.localeCompare(departmentNameB);
  }
);

ES6+

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

   departmentNameA.localeCompare(departmentNameB);
 }
);

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

在对此进行了一些尝试并尝试尽可能减少循环之后,我最终得到了这个解决方案:

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

您必须传递一个接受两个参数、比较它们并返回一个数字的函数,因此假设您想按 ID 对它们进行排序,您将编写...

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

一个简单的答案:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM