2017-02-14 6 views
-1

私はこのコードを次のようにします。違いの配列をソートすることを期待していましたが、Chromeで検査すると、ソートの前後で差の配列が同じになります。私のコードで何が間違っているのか、そしてソート方法がうまくいかない理由を指摘することで、助けてください。それは配列が(プッシュを使用して)作成される方法と関係しているように見えますが、何が間違っているのかはわかりません。javascriptプッシュメソッドを使用して使用されるオブジェクトの配列をソート

var differences = []; 

for (i = 0; i < locations.length; i++) { 
    var myObj = { 
     lat  : locations[i].lat, 
     lng  : locations[i].lng, 
     distance : locations[i].lng 
    }; 

    differences.push(myObj); 
} 

function compare(a, b) { 
    if (a.distance < b.distance) 
     return -1; 

    if (a.distance > b.distance) 
     return 1; 

    return 0; 
} 

console.log(differences); 
differences.sort(compare); 
console.log(differences); 
+0

おそらく積極的であることとあなたの両方のログで同じオブジェクトを示すChromeの。あなたの最初のログでは、このconsole.log(JSON.stringify(differences))); – tymeJV

+0

また、sortメソッドがUnicodeを使用してソートするとき、ソートは実際には数値に対して使用される安定メソッドではありません。例として、var nums = [2、10]; nums.sort(); 10、2ではなく2、10を出力します。なぜなら、ユニコードでは、10がユニコードポイント順で2より前に来るからです。私は数値にソートを使用することをお勧めします。 – Korgrue

+0

@ Korgrue OPはカスタム比較機能を使用しています。あなたの議論は適用されません。 – AmericanUmlaut

答えて

1

Google Chromeのコンソールは、オブジェクトを出力するときにオブジェクトを文字列に変換しません。代わりに、オブジェクトの実際の内容が表示されます。この内容は、後でオブジェクトが変更された場合に更新されます。これを実証するために

、コンソールを開き、次の行を入力します。あなたはあなたの後にこれを追加していても、あなたが「のhelloWorld」プロパティが出力にそれのために定義されていることがわかりますobjを展開する

var obj = {}; 
console.log(obj); 
obj.helloWorld = "Hi there"; 

をそれをコンソールに記録した。

これは、ソート機能が正常に動作していることを意味します。あなたが前と後の違いを確認したい場合は、あなたがそれをログインしたときにオブジェクトのクローンを作成することができます

console.log(JSON.parse(JSON.stringify(differences))); 
+0

私はこれを試みたが、うまくいかなかった。私が気づいたもう一つの点は、ソート前またはソート後に差分配列を記録すると(Chromeコンソールで)この[]のような配列を返します。クリックすると、0:Object 1:Objectなどのように展開されます。 objectはそれぞれのプロパティの値を保持します。差異[0]または差異[1]を記録しようとすると、定義されていないものが返されます。違いは配列なので奇妙に見えます。この動作の原因は不明です – altin

+0

@altin何がうまくいかないのですか?並べ替えの前後に配列を記録しても、変更されたことが示されませんでしたか? – AmericanUmlaut

+0

配列内のオブジェクトを見ることができません。どちらの場合も、空の配列を返します。 – altin

関連する問題