如何从函数中 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
我有一个对象(哈希数组),我需要将它转换成有序的键值对。
这是对象:
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