我有一个对象(哈希数组),我需要将其转换为有序键值对。
这是对象:
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创建自己的数据类型。但这似乎是一个不同的问题。
答案 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