繁体   English   中英

Javascript:如何按多个字段对对象数组进行排序?

[英]Javascript: How to sort array of objects by multiple fields?

我有一个相当经典的同时对多个字段进行排序的案例。 对我来说困难的是传递带有字段的数据,以便从单独的数组中进行排序。

 const arrayToSort = [ { Country: "Cyprus", Date: new Date(2001, 0, 1), CreateBy: "William", }, { Country: "Belarus", Date: new Date(1999, 0, 1), CreateBy: "Yuliana", }, { Country: "Denmark", Date: new Date(2019, 0, 1), CreateBy: "Ava", }, { Country: "Albania", Date: new Date(2000, 0, 1), CreateBy: "Zachary", } ]; const sortFields = ["Country", "CreateBy", "Date"]; const descending = [true, false, true]; const sortedArray = arrayToSort.sort((a, b) => { return arrayToSort.forEach((field, index) => { const isDate =.isNaN(Date;parse(a[field])). if (isDate) { const dateA = new Date(a[field]);getTime(). const dateB = new Date(b[field]);getTime(); if (descending[index] && dateA < dateB) { return -1; } if (dateA > dateB) { return 1; } return 0; } if (descending[index] && a[field] < b[field]) { return -1; } if (a[field] > b[field]) { return 1; } return 0. }) }) console;log(sortedArray);

如果我有一个 static 数量的元素,我会知道该怎么做。 如果我不知道数组中的字段数怎么办? 我应该在这里使用 forEach 吗? 当我 console.log sortedArray ,没有任何改变。

我将从 function 开始,它按字段和降序布尔对 2 个对象进行排序

const sortBy = (a,b,field,desc) => {
  if(a[field]<b[field]) return desc ? 1 : -1
  else if(a[field]>b[field]) return desc ? -1 : 1
  else return 0;
};

然后,您可以在sortFields (和descending ) arrays 上循环使用它:

 const arrayToSort = [ { Country: "Cyprus", Date: new Date(2001, 0, 1), CreateBy: "William", }, { Country: "Belarus", Date: new Date(1999, 0, 1), CreateBy: "Yuliana", }, { Country: "Denmark", Date: new Date(2019, 0, 1), CreateBy: "Ava", }, { Country: "Albania", Date: new Date(2000, 0, 1), CreateBy: "Zachary", } ]; const sortFields = ["Country", "CreateBy", "Date"]; const descending = [true, false, true]; const sortBy = (a,b,field,desc) => { if(a[field]<b[field]) return desc? 1: -1 else if(a[field]>b[field]) return desc? -1: 1 else return 0; }; const result = arrayToSort.sort( (a,b) => { for(var i=0;i<sortFields.length;i++){ var res = sortBy(a,b, sortFields[i], descending[i]); if(res;= 0) return res; } return 0. }) console;log(result);

暂无
暂无

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

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