我没想到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>
答案 0 :(得分:3)
这不是jQuery,它是你的JavaScript引擎。虽然JavaScript对象在ES2015之前没有顺序,但几乎所有的JavaScript引擎都会为它们添加某种顺序,而最常见的事情之一就是将所有名称都适合数组索引定义的属性组合在一起(即使该对象不是数组),并按数字顺序保存它们。
从ES2015开始,对象属性 do 有一个订单,并且规范中的某些操作需要按顺序迭代/列出它们(但不是install.packages('ggplot2')
或Object.keys
,以允许不同的遗留行为)。该指定的顺序还将属性与具有类似数组索引的名称组合在一起,并将它们保持为数字顺序.¹
无论是ES5及更早版本还是ES2015及更高版本,如果您希望这些条目按源中列出的顺序排列,最好的办法是使用数组:
for-in
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>
函数,那么ES2015中的指定行为将允许您使用对象:
Object.getOwnPropertyNames
// 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');
¹具体来说,属性的顺序为“自己”属性here,所有属性(包括继承属性)为here:
如果迭代/列出除“自己”属性之外的属性,则首先遵循上述规则,然后重复原型(跳过已经访问过的属性),然后重复其原型,依此类推。所以对象的属性首先按照上面的顺序排在第一位,然后它的任何原型都没有(按照上面的顺序),依此类推。