2015-08-09 66 views
-1

我有一个对象(散列数组),我需要将其转换为有序的键值对。如何从函数返回有序的键/值对?

这是对象:

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

我需要的功能(通过name字母)在同一个返回键/值(place_id/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制作自己的数据类型。但这似乎是不同的问题。

+0

由于JavaScript不保证你在一个对象的键的顺序,我想你没有别的选择。我希望,这篇文章可能会帮助你一点http://stackoverflow.com/questions/5525795/does-javascript-guarantee-object-property-order – Rudra

回答

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"]]; 
+0

Jeditable数据属性需要键/值对,我不能使用数组。 –

+0

@ w.k - 如果你想在Javascript中控制顺序,你可以使用数组。您不容易操纵对象上的属性顺序。事实上,在ES6之前,对象上的属性没有保证顺序。所以,因为你说你想要订单,所以我建议了一个数组 - 这是Javascript用于订单的东西。如果你可以使用字符串(yuk),那么为什么你不能使用数组?我不明白。我只是认为你正在试图找到有组织的方式来存储有序的键/值对。 – jfriend00

+0

我认为你是对的,因为即使使用字符串也不能按我的预期工作。看我的编辑。谢谢! –

0

Th在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