保证索引对象按顺序排列

时间:2019-03-21 23:03:32

标签: javascript arrays sorting object

扩展名this question

所以我在玩一个项目,我发现自己需要创建一个字符串,在该字符串中我不立即知道字母的确切顺序,但是我确实知道它们的位置(并扩展了其长度)。字符串)。

这样做的部分原因是,我不想在此过程中的任何时候跳过数组元素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"]
}

直到现在我找到的所有答案都不一定保证给定索引对象,它会给出相应的有序对象,这主要是因为对象的性质是无序的。

有没有办法实现这一目标?

3 个答案:

答案 0 :(得分:-1)

使用Object.keys(),您可以检索键数组,按数字sort,然后map将键值与数组排序为一个。

结果将是一个值数组,其顺序与键的数字值相对应,即使它们不是顺序的。

例如

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)

答案 1 :(得分:-1)

您可以通过两种可能的方式(可能还有更多)来解决此问题。

数组

将包含键和值的对象添加到数组中。

array.push({c: "a"})array.push({ key: c, value: "a"}),然后添加下一个,依此类推。

将元素放在数组的末尾。

排序对象

或者您可以使用字母键插入对象,在这种情况下,您可以使用下面的示例。

您可以对对象的键(属性)进行排序,并使用它们来访问每个值并将它们放入另一个数组中。这是一个详细的示例。

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)

答案 2 :(得分:-4)

由于Java脚本规范,简短的回答是“您不能”。

不能保证Javascript中的对象以任何方式对其键进行排序,因为它是一种原始类型,允许引擎从中进行优化,包括对键进行重新排序以加快属性访问。

如果排序真的很重要,那么您不应该使用对象原语。一个元组数组(保证有序):

let fixedList = [
  { key: 0, value: 'a' },
  { key: 4, vlaue: 'q' },
  ...
];

或者您可以使用Map(专门存在于 中)作为一种“对象,其键/值对的顺序与您声明的顺序相同”。

在两者中,对于数据传输,您可能需要前者,而对于运行代码,通常需要后者。