2017-08-01 162 views
0

编辑:冲销(N)(Underscore-)进行分类排列去除对象的属性

我录的用QuickTime的bug,为您的观赏乐趣。希望这可以帮助解决这个奇怪的问题。

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

更多的代码的详细信息,请参见:

https://www.pastebin.com/zUts9qmg


原题:

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

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

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

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()也会导致数据丢失。

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

所有帮助非常感谢!

+0

我不认为问题是由'reverse'造成的。尝试在'requirements = _.sortBy(requirements,event.target.id).reverse();'之前和之后放置'console.log(JSON.stringify(requirements [0]));'以验证'reverse'是真正的原因。 –

+0

结果:之前:“{”状态“:”延迟“,”ID“:107,”描述“:”能够根据Unify验证客户数据(以检查客户详细信息是否允许使用外部地址或外部备份地址) ),“Category”:“C1-SELL”,“segment”:1}和after:“{”ID“:346,”Description“:”支持客户账户的能力,包括但不限于不限于:在POS“,”Category“:”C12-PAY“,”segment“:1}'接收客户付款。 http://imgur.com/a/xgwKO –

+0

@Magicbjørn这显然是一个不同的对象,从一个不同的位置。很可能在排序/反转之前它没有'.Status'。 – Bergi

回答

0

_.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); 
}); 
+0

它的确返回'function reverse(){[native code]}'。是的,它不是Underscore的函数,但据我所知,Underscore没有函数来反转数组。 –

+0

这真的很有趣的问题。我试图在Chrome中重现它,但我不能。反转后,“状态”和“状态”字段都完好无损。你可以分享更多的信息/代码吗? – Styx

+0

我已经更新了我的答案,它应该可以解决您的问题。 – Styx

相关问题