如何从函数中 return 排序 key/value 对?

How to return ordered key/value pairs from function?

我有一个对象(哈希数组),我需要将它转换成有序的键值对。

这是对象:

var places_info = [
  {"place_id":180,"name":"Abc","city":"Gotham"},
  {"place_id":161,"name":"Def","city":"Sin City"},
  {"place_id":178,"name":"Ghi","city":"Timbuktu"},
  {"place_id":179,"name":"Jkl","city":"Acapulco"},
  {"place_id":174,"name":"Mno","city":"Desire"}
];

我需要 return key/value (place_id/name) 对的函数(按 name 的字母顺序排列)顺序:

{ 
  '180': 'Abc', 
  '161': 'Def',
  '178': 'Ghi',
  '179': 'Jkl',
  '174': 'Mno'
}

实际使用:我需要它作为Jeditable Select-input (actual example on demo页面的输入)。 Select 类型需要 data-属性 key/value 对或 return 函数。到目前为止,我得到了 select 个随机顺序的选项,但是——正如你想象的那样——我需要它们按值排序....

至于 Jeditable 的数据可能只是一个假的散列(字符串形成为 JSON key/value 对),我唯一的解决方案是这样的:

var arr = new Array;
for ( i in places_info ) {
  arr.push( "'" + places_info[i].place_id + "':'"  +  places_info[i].name + "'" );
}
var uglyString = '{' + arr.join(',') + '}';

有没有更优雅、更直观的方法来实现这样的目标?我想将我的数据保存在正确的数据结构中。将其转换为扁平字符串似乎很麻烦。

编辑

我必须重新考虑这个问题。我没有使用生成的字符串测试 Jeditable,它似乎将字符串评估为哈希,然后我想要的顺序就消失了。所以,这个问题需要不同的方法。也许我需要为 Jeditable 创建自己的数据类型。但这似乎是不同的问题。

在 ES6 之前,Javascript 对象上的属性没有保证的顺序。它们是无序的。如果您需要顺序并且需要支持 ES6 之前的环境,那么您不能只在对象上使用属性并获得这些属性的保证顺序。

所以你的选择是选择其他一些可以可靠地表达顺序的数据结构。像您所做的那样将它全部折叠成一个字符串是一种选择,但这意味着它必须重新解析才能对 Javascript 有用。最好将其保存为某种本机可访问的 Javascript 格式。对于顺序,这意味着使用数组。


您可以通过 return 排序数组来 return 排序对,然后有多种选择可以将什么放入数组。以下是有序 key/value 对的几个示例:

// array of objects
var a = [{key: "greeting", value: "hello"}, {key: "salutation", value: "welcome"}];

因为这对我来说似乎有点冗长,所以我经常使用一个快捷方式,它只知道每个其他元素都是一个键,然后是值,然后是键,然后是值,而不必拼出那些 属性 一遍又一遍的名字:

// alternating key/value
var a = ["greeting", "hello", "salutation", "welcome"];

或者,您可以将每个有序对放在数组本身中,这样每个子数组都是一个有序对:

// sub-arrays
var a = [["greeting", "hello"], ["salutation", "welcome"]];

JavaScript不保证对象中的属性顺序,您需要使用数组。

看看这个:

var obj = {
   '180': 'Abc', 
   '161': 'Def',
   '178': 'Ghi',
   '179': 'Jkl',
   '174': 'Mno'
};
for (var i in obj) { console.log(i); };

会给你:161, 174, 178, 179, 180

只需使用 JavaScript 的原生 Map 数据结构。它保持秩序。我们现在已经过了 2015 年,因此它应该成为几乎所有运行时的标准。

例如

const m = new Map([["greeting", "hello"], ["salutation", "welcome"]])

另见 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map