修改
我已经快速记录了这个错误,为了您的观赏乐趣。希望这有助于解决这个奇怪的问题。
https://www.dropbox.com/s/o72o1v1eqvrarb7/Weird%20Sorting%20Bug.mov?dl=0
了解更多代码详情,请参阅:
https://www.pastebin.com/zUts9qmg
原始问题:
我有一个奇怪的问题。我正在使用Meteor开发一个应用程序,其中一个依赖是Underscore.js。方便的小工具,但我碰到了一个奇怪的问题(bug,也许?)。
对一组对象进行排序可以正常工作,但是反转它不会。反转数组时,数组内对象的数据会被删除......
我创建了一个带有粘性标题的表,并动态添加表体。
点击表格标题中的一列会激出一些代码:
if (sortId != event.target.id) {
sortAsc = true;
sortId = event.target.id;
}
if (!sortAsc) {
requirements = _.sortBy(requirements, event.target.id).reverse();
} else {
requirements = _.sortBy(requirements, event.target.id);
}
sortAsc = !sortAsc;
CreateTable();
sortId
是一个字符串,表示我们要排序的键。要获得此sortId
,我们会查看event.target.id
,它是我们在表格标题中点击的项目的ID。
sortAsc
是一个布尔值,它将确定我们想要按升序还是降序排序。
requirements
是具有以下格式的数据的数组:
[
{
Status: "Something",
ID: 1,
Description: "Hahaha, yes!",
Category: "Category: Dairy",
segment: 1
},
{
//etc...
}
]
使用Underscore.js
,我使用_.sortBy([collection], [property to sort by]);
对数组进行排序。这按预期工作。它通过提供的sortId
对数组中的所有对象进行排序。但是,当它反转时,它会删除数组中所有对象的属性,导致表中缺少一列,并且样式变得混乱:
如您所见,在反转数组后,对象的status
属性消失了。这适用于数组中的所有10个对象。
我尝试使用_.sortBy
函数中的“自定义”排序函数基于硬编码属性进行排序,但它们都具有相同的结果。即使颠倒标准JavaScript排序.sort()
也会导致数据丢失。
有谁知道发生了什么事?我做错了吗?
非常感谢所有帮助!
答案 0 :(得分:0)
_.sortBy
返回Array
并在此数组中调用reverse()
,因此它不是underscore
的问题。
尝试执行此操作:console.log(Array.prototype.reverse);
输出应为ƒ reverse() { [native code] }
或类似,具体取决于您使用的浏览器。如果您看到[native code]
以外的任何内容 - 这意味着您有另一个reverse()
函数的实现,该函数无法正常工作。
<强>加了:强>
我建议您根本不使用reverse()
,并且只需排序即可完成所有工作。
requirements.sort((a, b) => {
const v1 = (sortAsc ? a : b)[sortId];
const v2 = (sortAsc ? b : a)[sortId];
return v1 < v2 ? -1 : ( v1 > v2 ? 1 : 0 );
});