2017-07-29 62 views
1

我想在函數內使用下劃線對數組進行排序。在使用下劃線'sortBy'時,我失去了傳遞給'orderData'函數的父數組'list'的引用。下劃線:失去對象數組的引用

'console.log'函數調用後沒有給我排序的'list'對象。我需要能夠排序數組而不會丟失參考。難道我做錯了什麼?我用的是要做到這一點

function orderData(data, testObj) { 
    data = _.chain(data) 
    .sortBy(function(item) { 
     return new Date(item.dt).getTime(); 
    }).sortBy('text').value(); 
    testObj.x = "updated"; 
    console.log(data, testObj); 
} 

var list = [ 
{id: 3,dt: new Date('8/1/17'),text: 'a'}, 
{id: 1,dt: new Date('5/1/17'),text: 'a'}, 
{id: 4,dt: new Date('5/1/17'),text: 'b'}, 
{id: 2,dt: new Date('5/10/17'),text: 'a'}]; 

var testObj = { 
    x: "Start" 
}; 

//console.log(list,testObj); 
orderData(list, testObj); 
console.log(list, testObj); 

小提琴: https://jsfiddle.net/9zo3qnej/1/

PS:我是新手,以強調和也的JavaScript。

+0

在這種情況下,究竟是「父對象」? – adeneo

+0

'list'數組來自函數外部。 –

+2

是的,你正在修改它的功能?如果你想保持函數不在函數之外,你必須在函數內部做一個深層拷貝,並且**返回**那個拷貝來代替? – adeneo

回答

0

如果您不想重寫代碼以使用Array.sort,則可以在完成排序後手動更新list。只需在第7行上添加:list = data傳入排序數組。

在這裏工作的小提琴。 https://jsfiddle.net/fjohkh6e/

0

data在函數內被重新分配時,它只是局部變量被更改。變量list本身不能通過其傳遞的參數進行更改。 (在更一般的術語,參數沒有「引用」通過)

無需重寫太多,最直接的解決辦法,是讓函數返回數組排序並重新分配list

function orderData(data) { 
 
    return _.chain(data) 
 
    .sortBy(function(item) { 
 
     return item.dt.getTime(); 
 
    }).sortBy('text').value(); 
 
} 
 

 
var list = [ 
 
{id: 3,dt: new Date('8/1/17'),text: 'a'}, 
 
{id: 1,dt: new Date('5/1/17'),text: 'a'}, 
 
{id: 4,dt: new Date('5/1/17'),text: 'b'}, 
 
{id: 2,dt: new Date('5/10/17'),text: 'a'}]; 
 

 
list = orderData(list); 
 
console.log(list);
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>

另請注意,第二個sortBy不是then by類型的排序。這意味着,最後一種是普遍的,'文本'是主要的排序順序,然後是日期。如果應該是相反的話,這種分類應該顛倒過來。

第二種方法是使用js native Array.sort代替。這改變了訂單本身(這與分配給變量不一樣)並具有額外的好處,即您可以一次比較兩個屬性。

相關問題