繁体   English   中英

保证索引对象按顺序排列

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM