如何根据对象的属性对对象数组进行排序

时间:2018-05-17 14:28:49

标签: javascript node.js

我有一个对象数组。 Array中的每个对象都有一个名为" priorityTag"

的属性

我想根据" priorityTag"按升序排序数组。 所以,我写了下面发布的代码,但它不起作用。

请告诉我如何根据" priorityTag"

对数组进行排序

注意:priortyTag是Array中包含的对象的属性。换句话说,Array中的每个元素都是一个对象,每个对象都有很多属性,但其中一个属性是" PriorityTag"

我想根据" priorityTag"

对数组进行排序

sortFeaturesPerPriority2(arr) {
logger.debug('[sortFeaturesPerPriority2]: arr:', arr);

 arr.sort((a, b) => a.priorityTag - b.priorityTag);
 }

3 个答案:

答案 0 :(得分:0)

要做到这一点,你可以使用我做过的原型

/**
 * ARRAY PROTOTYPE SORT BY
 * Used to sort an array by object field
 * @param {String} field
 */
Array.prototype.sortBy = function (field = '') {
    this.sort(function (a, b) {
        return a[field] == b[field] ? 0 : +( a[field] > b[field]) || -1;
    });
};

您可以这样使用:

let array = [{name: 'Jonh', age: 71}, {name: 'Tracey', age: 58}];
array.sortBy('age');
console.log(array); // Display [ { name: 'Tracey', age: 58 }, { name: 'Jonh', age: 71 } ]

希望它有所帮助。

答案 1 :(得分:0)

假设你在integers like内有priorityTag个变量,你需要在排序之前解析它们

sortFeaturesPerPriority2(arr) {
    logger.debug('[sortFeaturesPerPriority2]: arr:', arr);

     arr.sort(({priorityTag: p1}, {priorityTag: p2}) => parseInt(p1) - parseInt(p2));
 }

如果您无法将您的priorityTag解析为数值(假设您有priorityTag == 'a'priorityTag == 'b'),则可以在评论中查看@sander提供的link

修改

并没有真正回答OP的问题,但这里有一种根据属性定义各种排序的简洁方法:

const arr = [
  {priorityTag: 'a'}, 
  {priorityTag: 'e'},
  {priorityTag: 'd'},
  {priorityTag: 'b'},
  {priorityTag: 'c'}, 
];

const numericSort = prop => ({[prop]: a}, {[prop]: b}) => a - b;
const alphaSort = prop => ({[prop]: a}, {[prop]: b}) => a < b ? -1 : 1;
const weirdCustomSort = prop => ({[prop]: a}, {[prop]: b}) => {
  const elements = ['a','e','b','d','c'];
  const aIndex = ~elements.indexOf(a) ? elements.indexOf(a) : elements.length;
  const bIndex = ~elements.indexOf(b) ? elements.indexOf(b) : elements.length;
  return aIndex - bIndex;
};

const compareBy = prop => sortFunc => sortFunc(prop)

console.log([...arr].sort(compareBy('priorityTag')(alphaSort)))
console.log([...arr].sort(compareBy('priorityTag')(numericSort)))
console.log([...arr].sort(compareBy('priorityTag')(weirdCustomSort)))

答案 2 :(得分:0)

假设优先级标记是一个数字,那么这看起来是正确的。我尝试使用这些代码然后命令它们

const arr = [
  {priorityTag: 1},
  {priorityTag: 5},
  {priorityTag: 0},
  {priorityTag: 2},
  {priorityTag: 6},
]
arr.sort( (a,b) => a.priorityTag - b.priorityTag ); // 0,1,2,5,6

如果priorityTag是一个字符串,那么我只会使用以下内容。这实际上适用于字符串和数字,假设您确定默认情况下大于字符串的工作方式。

arr.sort( (a,b) => a.priorityTag > b.priorityTag );