2017-08-01 52 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

相關問題