[英]guaranteed indexed object to array in order
这个问题的延伸
因此,我在一个项目中玩耍,发现自己需要创建一个字符串,在该字符串中我不立即知道字母的确切顺序,但是我确实知道它们的位置(并扩展了此字符串的长度)。
这样做的部分原因是, 我不想在处理过程中的任何时候跳过数组元素(在处理过程中为 NO ["a", , "t"] during the process
)。 这意味着插入顺序很重要。
let string_length = 10;
let o = {
0: "a",
4: "q",
7: "t",
3: "p",
6: "h",
1: "z",
2: "t",
5: "a",
9: "b",
8: "z"
};
function obj_to_arr(o) {
// this returns ["a","z","t","p","q","a","h","t","z","b"]
}
到目前为止,我发现的所有答案都不一定保证给定一个索引对象,它会给出相应的有序对象,这主要是因为对象的性质是无序的。
有办法实现吗?
使用Object.keys()
,您可以检索一个键数组,对其进行数字排序 ,然后将排序后的数组映射到带有值的数组。
结果将是与键的数字值相对应的顺序的值数组,即使它们不是顺序的。
例如
let o = {"0":"a","1":"z","2":"t","3":"p","4":"q","5":"a","6":"h","7":"t","8":"z","10":"b"} let sortedValues = Object.keys(o) .sort((a, b) => a - b) // numeric comparison .map(k => o[k]) // map to values console.info(sortedValues)
您可以通过两种可能的方式(可能还有更多)来解决此问题。
数组
您可以将包含键和值的对象添加到数组中。
array.push({c: "a"})
或array.push({ key: c, value: "a"})
,然后添加下一个,依此类推。
Push将元素放在数组的末尾。
排序对象
或者使用字母键插入对象,在这种情况下,可以使用以下示例。
您可以对对象的键(属性)进行排序,并使用它们来访问每个值并将它们放入另一个数组中。 这是如何实现此目的的详细示例。
const someObject = { c: "a", 4: "q", 7: "t", b: "p", 6: "h", 1: "z", 2: "t", 5: "a", a: "b", 8: "z" }; function obj_to_arr(obj) { let result = [] // Get keys from object as an array let keys = Object.keys(obj) console.log('keys: ', keys) // Sort the array in alphabetical order let sorted = keys.sort() console.log('sorted: ', sorted) // Add each value to the resulting array sorted.forEach(function(key) { console.log('adding ' + obj[key] + ' to array') result.push(obj[key]) }) console.log('result: ', result) return result } // Call the function obj_to_arr(someObject)
简短的答案是“您不能”,因为Javascript规范。
不能保证Javascript中的对象以任何方式对其键进行排序,因为它是允许引擎优化地狱的原始类型,包括对键进行重新排序以加快属性访问。
如果排序真的很重要,那么您不应该使用对象原语。 一个元组数组(已保证有序):
let fixedList = [
{ key: 0, value: 'a' },
{ key: 4, vlaue: 'q' },
...
];
或者,您可以使用Map ,它专门作为一种“对象,具有与声明的键/值对相同的顺序”而存在。
在这两者中,对于数据传输,您可能需要前者,而对于运行代码,通常需要后者。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.