Javascript意外排序顺序

Javascript意外排序顺序,javascript,google-chrome,Javascript,Google Chrome,使用Chrome版本66.0.3359.117(官方版本)(64位) 对下面的数组进行排序我希望id=1的项位于顶部,但实际情况并非如此。如果我将项目的数量减少到2个,则排序工作将按预期进行。有人能解释为什么我会得到一个不确定的结果吗 let数组=[ {“id”:1,“path”:“01.00.00.00.00.00.00”}, {“id”:2,“path”:“01.02.00.00.00.00.00”}, {“id”:3,“路径”:“01.02.03.00.00.00”}, {“id”:4,

使用Chrome版本
66.0.3359.117
(官方版本)(64位)

对下面的数组进行排序我希望id=1的项位于顶部,但实际情况并非如此。如果我将项目的数量减少到2个,则排序工作将按预期进行。有人能解释为什么我会得到一个不确定的结果吗

let数组=[
{“id”:1,“path”:“01.00.00.00.00.00.00”},
{“id”:2,“path”:“01.02.00.00.00.00.00”},
{“id”:3,“路径”:“01.02.03.00.00.00”},
{“id”:4,“路径”:“01.02.04.00.00.00”},
{“id”:5,“路径”:“01.02.05.00.00.00”},
{“id”:6,“路径”:“01.02.06.00.00.00”},
{“id”:7,“路径”:“01.02.05.07.00.00.00”},
{“id”:8,“路径”:“01.02.05.07.08.00.00”},
{“id”:9,“路径”:“01.02.05.07.08.09.00”},
{“id”:10,“path”:“01.02.04.10.00.00.00”},
{“id”:11,“路径”:“01.02.05.07.08.09.11”},
{“id”:12,“路径”:“01.02.04.10.12.00.00”}
];
排序((f,s)=>f.path>s.path);
控制台。错误(“已满”,数组[0]。id);
数组=[
{“id”:1,“path”:“01.00.00.00.00.00.00”},
{“id”:2,“路径”:“01.02.00.00.00.00.00”}
//{“id”:3,“路径”:“01.02.03.00.00.00”},
//{“id”:4,“路径”:“01.02.04.00.00.00”},
//{“id”:5,“路径”:“01.02.05.00.00.00”},
//{“id”:6,“路径”:“01.02.06.00.00.00”},
//{“id”:7,“路径”:“01.02.05.07.00.00.00”},
//{“id”:8,“路径”:“01.02.05.07.08.00.00”},
//{“id”:9,“路径”:“01.02.05.07.08.09.00”},
//{“id”:10,“path”:“01.02.04.10.00.00.00”},
//{“id”:11,“路径”:“01.02.05.07.08.09.11”},
//{“id”:12,“路径”:“01.02.04.10.12.00.00”}
];
排序((f,s)=>f.path>s.path);

console.error(“Reduced”,数组[0].id)首先,您正在比较两个字符串,就像它们是数字一样,因此我认为编译器会将字符串转换为数字,然后进行比较:

f.path > s.path 

您是按路径进行排序,而不是按id进行排序


尝试
array.sort((f,s)=>f.id-s.id)

您需要将排序条件更改为
f.id-s.id
,这在代码中是不正确的

let数组=[
{“id”:1,“path”:“01.00.00.00.00.00.00”},
{“id”:2,“path”:“01.02.00.00.00.00.00”},
{“id”:3,“路径”:“01.02.03.00.00.00”},
{“id”:4,“路径”:“01.02.04.00.00.00”},
{“id”:5,“路径”:“01.02.05.00.00.00”},
{“id”:6,“路径”:“01.02.06.00.00.00”},
{“id”:7,“路径”:“01.02.05.07.00.00.00”},
{“id”:8,“路径”:“01.02.05.07.08.00.00”},
{“id”:9,“路径”:“01.02.05.07.08.09.00”},
{“id”:10,“path”:“01.02.04.10.00.00.00”},
{“id”:11,“路径”:“01.02.05.07.08.09.11”},
{“id”:12,“路径”:“01.02.04.10.12.00.00”}
];
排序((f,s)=>f.id-s.id);
控制台。错误(“已满”,数组[0]。id);

您必须提供3个选项

array.sort((f, s) => {
  if(f.path < s.path){return -1}
  if(f.path > s.path){return 1} 
  return 0;
});
array.sort((f,s)=>{
如果(f.paths.path){return 1}
返回0;
});

基本上,js比较函数需要返回一个整数,因为'>'返回一个布尔值,那么true==1和false==0,因此当返回false时,它被解释为元素相等,而不是-1。你想按id还是按路径排序?你说你按id排序,但你不知道它是否值得,在Firefox 59上,结果与您期望的一样,即第一项的id为
1
。干杯@mplungjan感谢您修复了格式。
sort()
难道不希望您返回一个数字而不是布尔值吗?返回true或false,将转换为0或1。因此,您永远不会返回-1或其他负数,因此如果一个记录属于另一个记录,则记录将无法正确排序。呵呵-为什么两个数组的排序会有所不同?:)这是您将两个字符串作为数字进行比较的逻辑,因此您将看到一些意外的行为,仍然好奇为什么对于相同的输入我会得到不同的结果?应该与返回s.path-f.path相同,否?@mplungjan否,js不能将“00.20.10”转换为数字,因此它返回NaNAh-我可以测试,因为这是ascii顺序,我实际上认为它也可以与“减法”一起工作,但从未尝试过。不过在身份证上工作