反转(n)(Underscore-)排序数组会从对象中删除属性

时间:2017-08-01 10:59:24

标签: javascript arrays sorting meteor underscore.js

修改

我已经快速记录了这个错误,为了您的观赏乐趣。希望这有助于解决这个奇怪的问题。

https://www.dropbox.com/s/o72o1v1eqvrarb7/Weird%20Sorting%20Bug.mov?dl=0

了解更多代码详情,请参阅:

https://www.pastebin.com/zUts9qmg

原始问题:

我有一个奇怪的问题。我正在使用Meteor开发一个应用程序,其中一个依赖是Underscore.js。方便的小工具,但我碰到了一个奇怪的问题(bug,也许?)。

对一组对象进行排序可以正常工作,但是反转它不会。反转数组时,数组内对象的数据会被删除......

我创建了一个带有粘性标题的表,并动态添加表体。

Example of table used

点击表格标题中的一列会激出一些代码:

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对数组中的所有对象进行排序。但是,当它反转时,它会删除数组中所有对象的属性,导致表中缺少一列,并且样式变得混乱:

Logging before and after the reversing of the array

Here are the logs in the browser

如您所见,在反转数组后,对象的status属性消失了。这适用于数组中的所有10个对象。

我尝试使用_.sortBy函数中的“自定义”排序函数基于硬编码属性进行排序,但它们都具有相同的结果。即使颠倒标准JavaScript排序.sort()也会导致数据丢失。

有谁知道发生了什么事?我做错了吗?

非常感谢所有帮助!

1 个答案:

答案 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 );
});