在JavaScript中,根据对象在输入数组中的位置,按多个字段对对象数组进行排序会有所不同



在研究JavaScript中按多个属性/字段/属性排序数组的机制时,我遇到了这篇文章。对于我的个人项目,我使用了@chriskelly提供的解决方案。

function comparator(attrs) {
return function (v1, v2) {
return attrs
.map(function (fld) {
var ad = 1;
if (fld[0] === '-') {
ad = -1;
fld = fld.substring(1);
}
if (v1[fld] > v2[fld]) return ad;
if (v1[fld] < v2[fld]) return -(ad);
return 0;
})
.reduce(function nonZero (v3, v4) {
return v3 ? v3 : v4;
}, 0);
};
}

我的输入数组如下:

[{"name":"Pass9884881","fld1d":10,"fld2d":25,"fld4d":383,"fld3d":626490,"fld5a":0,"date":"09/27/2021","time":"18:23:31"},
{"name":"Driver1","fld1d":"10","fld2d":25,"fld4d":356,"fld3d":559650,"fld5a":0,"date":"10/18/2021","time":"14:48:17"},
{"name":"Driver321","fld1d":10,"fld2d":22,"fld4d":346,"fld3d":554400,"fld5a":1,"date":"08/08/2021","time":"22:35:03"},
{"name":"Driverxyz","fld1d":9,"fld2d":25,"fld4d":350,"fld3d":497190,"fld5a":0,"date":"07/26/2021","time":"14:23:33"},
{"name":"Pass1974761","fld1d":"9","fld2d":25,"fld4d":316,"fld3d":477290,"fld5a":0,"date":"10/11/2021","time":"19:20:33"},
{"name":"Pass7374147","fld1d":"9","fld2d":23,"fld4d":279,"fld3d":376750,"fld5a":0,"date":"10/10/2021","time":"20:13:15"},
{"name":"Driver0","fld1d":8,"fld2d":25,"fld4d":286,"fld3d":435940,"fld5a":0,"date":"07/26/2021","time":"12:31:42"},
{"name":"Pass1536735","fld1d":"8","fld2d":25,"fld4d":236,"fld3d":329880,"fld5a":0,"date":"10/09/2021","time":"17:19:14"},
{"name":"#xxxxyyyy","fld1d":"10","fld2d":25,"fld4d":329,"fld3d":500440,"fld5a":0,"date":"11/04/2021","time":"00:04:17"},
{"name":"Pass7668209","fld1d":"8","fld2d":24,"fld4d":203,"fld3d":267150,"fld5a":0,"date":"10/09/2021","time":"00:22:18"}]

它意味着按fld1d(desc(、fld2d(desk(、fld3d(dess(、fld4d(desc,fld5a(asc(、日期(asc,date,asc,time,asc(进行排序。当具有";name":"xxxxyyyy"被放置在输入数据的最后一个或紧挨着最后一个(从代码中的外部文件读取(,则生成的排序数组显示不正确:排列不正确的阵列

但是,如果我将输入文件中的对象移动到第8个位置(共10个(或更高位置,则得到的排序数组是正确的:正确排序的阵列

我应该承认,我不是一个专业的开发人员,只是一个有兴趣的人,他们在一定程度上学会了以身作则,我很难解释结果中的差异。

如有建议,我们将不胜感激。

您可以采用一种简化的方法,通过使用delta或字符串比较来链接所有排序crieria。

const
getISO = (date, time) => `${date.slice(3, 5)}-${date.slice(0, 2)}-${date.slice(6, 10)}T${time}`;
data = [{ name: "Pass9884881", fld1d: 10, fld2d: 25, fld4d: 383, fld3d: 626490, fld5a: 0, date: "09/27/2021", time: "18:23:31" }, { name: "Driver1", fld1d: "10", fld2d: 25, fld4d: 356, fld3d: 559650, fld5a: 0, date: "10/18/2021", time: "14:48:17" }, { name: "Driver321", fld1d: 10, fld2d: 22, fld4d: 346, fld3d: 554400, fld5a: 1, date: "08/08/2021", time: "22:35:03" }, { name: "Driverxyz", fld1d: 9, fld2d: 25, fld4d: 350, fld3d: 497190, fld5a: 0, date: "07/26/2021", time: "14:23:33" }, { name: "Pass1974761", fld1d: "9", fld2d: 25, fld4d: 316, fld3d: 477290, fld5a: 0, date: "10/11/2021", time: "19:20:33" }, { name: "Pass7374147", fld1d: "9", fld2d: 23, fld4d: 279, fld3d: 376750, fld5a: 0, date: "10/10/2021", time: "20:13:15" }, { name: "Driver0", fld1d: 8, fld2d: 25, fld4d: 286, fld3d: 435940, fld5a: 0, date: "07/26/2021", time: "12:31:42" }, { name: "Pass1536735", fld1d: "8", fld2d: 25, fld4d: 236, fld3d: 329880, fld5a: 0, date: "10/09/2021", time: "17:19:14" }, { name: "#xxxxyyyy", fld1d: "10", fld2d: 25, fld4d: 329, fld3d: 500440, fld5a: 0, date: "11/04/2021", time: "00:04:17" }, { name: "Pass7668209", fld1d: "8", fld2d: 24, fld4d: 203, fld3d: 267150, fld5a: 0, date: "10/09/2021", time: "00:22:18" }],
data.sort((a, b) =>
b.fld1d - a.fld1d ||
b.fld2d - a.fld2d ||
b.fld3d - a.fld3d ||
b.fld4d - a.fld4d ||
a.fld5a - b.fld5a ||
getISO(a.date, a.time).localeCompare(getISO(b.date, b.time))
);
console.log(data);
.as-console-wrapper { max-height: 100% !important; top: 0; }

最新更新