2017-07-29 1 views
1

関数内でアンダースコアを使用して配列をソートしようとしています。 'sortBy'というアンダースコアを使用すると、 'orderData'関数に渡される親配列 'list'への参照が失われています。アンダースコア:オブジェクトの配列への参照を失う

'console.log'関数呼び出しの後に、私はソートされた 'リスト'オブジェクトを与えません。私は参照を失うことなく配列をソートできるようにする必要があります。私は何か間違っているのですか?私はこれを行うために使用していた

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>

また、第2のsortByは、then byの種類のソートではありません。つまり、最後の並べ替えが一般的で、 'テキスト'がメインの並べ替え順、次に日付です。逆の場合は、ソートを逆にする必要があります。

2番目の方法は、代わりにjsネイティブArray.sortを使用することです。これはオーダー自体を変えます(これは変数に代入することと同じではありません)。そして、両方のプロパティを一度に比較できるという利点があります。

関連する問題