如何从函数返回有序的键/值对?

时间:2015-08-09 08:07:03

标签: javascript jeditable

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

这是对象:

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"}
];

我需要函数来返回键/值(place_id / name)对(按name按字母顺序排列)顺序:

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

实际使用:我需要它作为Jeditable选择输入(demo页面上的实际示例)的输入。选择类型需要data - 属性键/值对或返回它们的函数。到目前为止,我以随机顺序选择了选项,但是 - 正如您可能想象的那样 - 我需要按价值排序....

至于Jeditable,数据可能只是假哈希(字符串形成为JSON键/值对),我唯一的解决方案是这样的:

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创建自己的数据类型。但这似乎是一个不同的问题。

2 个答案:

答案 0 :(得分:2)

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

因此,您的选择是选择一些可以可靠地表达订单的其他数据结构。将它全部折叠到像你已经完成的字符串是一种选择,但这意味着它必须被重新解析才能对Javascript有用。最好将它保存在一些本机可访问的Javascript格式中。对于订单,这意味着使用数组。

您可以通过返回排序的数组来返回有序对,然后有几个选项可以放入数组中。以下是有序键/值对的几个示例:

// 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"]];

答案 1 :(得分:0)

在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