【发布时间】:2018-01-08 05:03:29
【问题描述】:
编辑:
我已经用 quicktime 记录了这个错误,供您观赏。希望这有助于解决这个奇怪的问题。
https://www.dropbox.com/s/o72o1v1eqvrarb7/Weird%20Sorting%20Bug.mov?dl=0
更多代码详情见:
https://www.pastebin.com/zUts9qmg
原始问题:
我有一个奇怪的问题。我正在使用 Meteor 开发应用程序,它的依赖项之一是 Underscore.js。方便的小工具,但我遇到了一个奇怪的问题(可能是错误?)。
对对象数组进行排序可以正常工作,但对其进行反转则不行。反转数组时,数组内对象的数据被删除...
我创建了一个带有粘性标题的表格并动态添加表格主体。
单击表格标题中的一列会触发一些代码:
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() 也会导致数据丢失。
有人知道发生了什么吗?我做错了吗?
非常感谢所有帮助!
【问题讨论】:
-
我认为问题不是由
reverse引起的。尝试将console.log(JSON.stringify(requirements[0]));放在requirements = _.sortBy(requirements, event.target.id).reverse();之前和之后,以验证reverse确实是原因。 -
结果:之前:
{"Status":"Delayed","ID":107,"Description":"Ability to validate the customer data against Unify (to check if customer details are allowed like foreign address or foreign back-account of foreign delivery address).","Category":"C1-SELL","segment":1}之后:{"ID":346,"Description":"The ability to support customer accounts including but not limited to : Receive customer payments at POS","Category":"C12-PAY","segment":1}。 imgur.com/a/xgwKO -
@Magicbjørn 这显然是一个不同的对象,来自不同的位置。可以肯定的是,在排序/反转之前它也没有
.Status。
标签: javascript arrays sorting meteor underscore.js