所以我在玩一个项目,我发现自己需要创建一个字符串,在该字符串中我不立即知道字母的确切顺序,但是我确实知道它们的位置(并扩展了其长度)。字符串)。
这样做的部分原因是,我不想在此过程中的任何时候跳过数组元素(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"]
}
直到现在我找到的所有答案都不一定保证给定索引对象,它会给出相应的有序对象,这主要是因为对象的性质是无序的。
有没有办法实现这一目标?
答案 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(专门存在于 中)作为一种“对象,其键/值对的顺序与您声明的顺序相同”。
在两者中,对于数据传输,您可能需要前者,而对于运行代码,通常需要后者。