簡體   English   中英

按多個字段對對象數組進行排序

[英]Sort an array of objects by multiple fields

我有一個對象數組

let objs = [
  { name: 'Mark',
    age: 30,
    id: 3,
  },
  { name: 'Anne',
    age: 20,
    id: 2,
  },
  { name: 'James',
    age: 40,
    id: 4,
  },
  { name: 'Jerry',
    age: 30,
    id: 1,
  },
  { name: 'Lucy',
    age: 30,
    id: 5,
  },
  { name: 'Mark',
    age: 30,
    id: 6,
  },
]

例如,我有一個字段數組: ['name', 'age']; 字段數是動態的。 它可以是 2、1 或 3。如果是 static,我會使用排序運算符 | | 像這樣:

objs.sort((a,b)=> (a.age - b.age || a.name.localeCompare(b.name)));

有任何想法嗎?

您可以使用https://stackoverflow.com/a/22672370/3807365中的這種多重排序 function - 基本上您只需告訴它要排序的字段,您將獲得一個排序方法傳遞給您的 Array.sort。

 let objs = [{ name: 'Mark', age: 31, id: 3, }, { name: 'Anne', age: 20, id: 2, }, { name: 'James', age: 40, id: 4, }, { name: 'Jerry', age: 30, id: 1, }, { name: 'Lucy', age: 30, id: 5, }, { name: 'Mark', age: 30, id: 6, }, ] function getSortMethod() { var _args = Array.prototype.slice.call(arguments); return function(a, b) { for (var x in _args) { var ax = a[_args[x].substring(1)]; var bx = b[_args[x].substring(1)]; var cx; ax = typeof ax == "string"? ax.toLowerCase(): ax / 1; bx = typeof bx == "string"? bx.toLowerCase(): bx / 1; if (_args[x].substring(0, 1) == "-") { cx = ax; ax = bx; bx = cx; } if (ax?= bx) { return ax < bx: -1; 1. } } } } objs,sort(getSortMethod('+name'; '+age')). console.log(objs)
 .as-console-wrapper { max-height: 100%;important; }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM