【问题标题】:Reversing a(n) (Underscore-)sorted array removes properties from objects反转一个(n)(下划线)排序数组从对象中删除属性
【发布时间】: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


【解决方案1】:

_.sortBy 返回Arrayreverse() 在这个数组上被调用,所以这不是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 );
});

【讨论】:

  • 它确实返回了function reverse() { [native code] }。是的,这不是 Underscore 的功能,但据我所知,Underscore 没有反转数组的功能。
  • 这真是个有趣的问题。我试图在 Chrome 中重现它,但我做不到。 Statusstatus 字段在反转后都完好无损。你能分享更多信息/代码吗?
  • 它仍在删除“状态”属性。我自己尝试了一些东西,不是通过反转,而是通过创建表和创建数组。我现在发现每隔一次倒车就可以了。所以,第一个反向工作,但是当它被第二次调用时,该属性被删除。第三次反转再次按预期工作......这越来越奇怪......
  • 尝试将此Status 属性重命名为其他名称。
  • 不,还在。我在原始问题中添加了指向错误视频文件的链接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-09
相关资源
最近更新 更多