2016-12-04 7 views
2

jQueryのマップから結果がソートされるとは思われませんでした。それを使用したり、それと同様に使用したり、結果をソースと同じ順序に保つことは可能ですか?jQueryのマップを並べ替えることはできませんか?

var items = { 
 
    "7": "AAA", 
 
    "6": "BBB", 
 
    "2": "CCC", 
 
    "4": "DDD", 
 
    "3": "EEE", 
 
    "1": "FFF", 
 
    "5": "GGG" 
 
}; 
 

 
function ShowList(list, target) { 
 
    $(target).append($.map(list, function (val, key) { 
 
    return '<li>' + key + ':' + val + '</li>'; 
 
    }).join("\r\n")); 
 
} 
 

 
ShowList(items, '#list');
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<ul id="list"></ul>

答えて

3

それはあなたのJavaScriptエンジンだ、jQueryのではありません。 JavaScriptオブジェクトにはES2015より前の注文はありませんでしたが、ほぼすべてのJavaScriptエンジンで何らかの順序が追加されました。最も一般的なことの1つは、名前が配列インデックスの定義に合ったすべてのプロパティをグループ化することですそのオブジェクトは配列ではありません)、数値順に保持します。 ES2015のよう

、オブジェクトプロパティ注文を持っていますし、明細書中の特定の操作は、(異なる従来の動作を可能にするためにではなく、Object.keys又はfor-in)この順序でそれらをリスト/反復処理するために必要とされます。指定された順序では、配列インデックスのような名前のプロパティもグループ化され、数値順に保持されます.¹

ES5以前とES2015以降とは関係なく、あなたは配列インデックスのように見えるとObject.getOwnPropertyNamesなかったプロパティ名を使用する場合は、ES2015の指定された行動は、あなたがオブジェクトを使用できるようになり

var items = [ 
 
    {key: "7", val: "AAA"}, 
 
    {key: "6", val: "BBB"}, 
 
    {key: "2", val: "CCC"}, 
 
    {key: "4", val: "DDD"}, 
 
    {key: "3", val: "EEE"}, 
 
    {key: "1", val: "FFF"}, 
 
    {key: "5", val: "GGG"} 
 
]; 
 

 
function ShowList(list, target) { 
 
    $(target).append($.map(list, function (entry) { 
 
    return '<li>' + entry.key + ':' + entry.val + '</li>'; 
 
    }).join("\r\n")); 
 
} 
 

 
ShowList(items, '#list');
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<ul id="list"></ul>

:あなたの最善の策は、配列を使用することです関数:

// ONLY RELIABLE ON A COMPLIANT ES2015+ ENGINE. 
 
// Not recommending doing this, just noting it. 
 
var items = { 
 
    "p7": "AAA", 
 
    "p6": "BBB", 
 
    "p2": "CCC", 
 
    "p4": "DDD", 
 
    "p3": "EEE", 
 
    "p1": "FFF", 
 
    "p5": "GGG" 
 
}; 
 

 
function ShowList(list, target) { 
 
    $(target).append(Object.getOwnPropertyNames(list).map(function (key) { 
 
    return '<li>' + key + ':' + list[key] + '</li>'; 
 
    }).join("\r\n")); 
 
} 
 

 
ShowList(items, '#list');
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<ul id="list"></ul>


具体的には、プロパティの順序は、 "自分の" プロパティのhereを与え、そして(継承されたものを含む)すべてのプロパティのhereさ¹:

  • 最初に配列インデックスのように見える、独自のプロパティーを数値順
  • 所有プロパティwホース名は、プロパティの作成順にリストされていない文字列です(プロパティはオブジェクトイニシャライザにリストされた順序で作成されます)。
  • シンボル名、

"own"プロパティ以外の反復/リストプロパティの場合は、最初にルールを実行してからプロトタイプを繰り返します(既に訪問したプロパティをスキップしてからプロトタイプを繰り返します)。そうです。そのため、オブジェクトのプロパティが上記の順序で最初に来ると、そのプロトタイプには(上の順序で)等しくないことがあります。

関連する問題