Объекты Javascript неупорядочены по своей природе. Если вам нужна упорядоченная объектно-подобная переменная, я бы предложил использовать map .
. Чтобы достичь того, что вы ищете, с помощью карты вместо объекта, вы должны сделать что-то вроде ниже:
var map1 = new Map();
map1.set("123", "c");
map1.set(123, "b");
var iterator1 = map1.keys();
var myarray = [];
for (var i = 0; i < map1.size; i++) {
myarray.push(iterator1.next().value);
}
console.log(myarray);
// Array ["123", 123]
К сожалению, он не совместим с IE, и я не уверен, как еще можно добиться того, что вам нужно без него. Быстрый Google все-таки возвратил что-то о картах jQuery .
Если вы не хотите использовать jQuery и все еще должны поддерживать IE, некоторые пункты приведены ниже:
Что-нибудь мешает вам использовать массив, а не объект JS для хранения нужных вам данных? Это сохранит порядок в соответствии с вашими требованиями в отличие от объектов. Вы можете иметь запись объекта в каждой итерации, которая представляет ключ, а затем использовать традиционный foreach для получения их в виде массива. Т.е.
Массив:
var test_array = [
{key: 123, value: 'a value here'},
{key: "123", value: 'another value here'}
];
// console.log(test_array);
Получение ключей:
var test_array_keys = [];
test_array.forEach(function(obj) { test_array_keys.push(obj['key']); } );
// console.log(test_array_keys);
Затем, если вам нужно проверить, существует ли ключ, перед добавлением новой записи (чтобы предотвратитьдубликаты) вы можете сделать:
function key_exists(key, array)
{
return array.indexOf(key) !== -1;
}
if(key_exists('12345', test_array_keys))
{
// won't get here, this is just for example
console.log('Key 12345 exists in array');
}
else if(key_exists('123', test_array_keys))
{
console.log('Key 123 exists in array');
}
Будет ли это работать? Если нет, то единственным другим предложением будет сохранение отдельного массива рядом с объектом, который отслеживает ключи и обновляется при добавлении или удалении записи в / из объекта.