Использовать pop() с ассоциативными массивами JavaScript
Как я могу сделать что-то вроде JS? Я хотел бы подражать .pop()
объекту, а не массиву.
var deck = {
'cardK' :'13',
'cardQ' :'12',
'cardAJ':'11'
};
var val = deck.pop();
console.log("Key" + val.key );
console.log("Value" + val.val );
Кажется, что это невозможно.
Ответы
Ответ 1
.pop
доступен только в массиве. В JavaScript объекты (которые по существу являются ассоциативными массивами) не упорядочены, как массив, поэтому нет метода .pop
.
Вы можете использовать массив:
var deck = [
{ key: 'cardK', val: 13 },
{ key: 'cardQ', val: 12 },
{ key: 'cardAJ', val: 11 },
];
var val = deck.pop();
console.log('key: ' + val.key);
console.log('aa: ' + val.val);
Ответ 2
Как было предложено другими ответами, лучшим решением здесь может быть использование массива объектов. Однако вы также можете создать свою собственную функцию pop, которая удаляет ключ из объекта, например:
function pop(obj) {
var key = Object.keys(obj).pop();
var result = {key: key, val: obj[key]};
delete obj[key];
return result;
}
var val = pop(deck);
Вы можете добавить аналогичную функцию pop
в Object.prototype
, чтобы вы могли сделать deck.pop()
, но я настоятельно рекомендовал бы против этого типа дизайна.
Ответ 3
Вы правы, это невозможно. См. Объекты как карты или хеш-таблицы, а не "ассоциативные массивы". Свойства не имеют порядка, и поэтому метод, такой как .pop
, не имеет смысла (если, конечно, он не удалит случайное свойство, например, словари Python).
Если вы хотите использовать .pop
и val.key
и val.val
, вам необходимо создать массив объектов:
var deck = [
{key: 'cardK', val: '13'},
{key: 'cardQ', val: '12'},
{key: 'cardAJ', val: '11'}
];
Ответ 4
Как я уверен, вы знаете, .pop
- прототипный метод Array
, поэтому вы не можете использовать его с объектами Javascript.
Вызов .pop
в массиве удалит элемент last из массива. Тем не менее, не существует "последней" пары ключ-значение с объектами, поскольку их порядок никогда не гарантируется. Несмотря на это, если вы не заботитесь о порядке, вы можете реализовать .pop
-подобную функцию для использования с объектами, но, опять же, она не удалит и не вернет конечную пару ключа-значения.
Что-то вроде этого должно сделать трюк:
function pop(obj) {
for (var key in obj) {
var val = obj[key];
delete obj[key];
return {
'key' : key,
'val' : val,
};
};
};
В сочетании с вашим кодом:
var val = pop(deck);
console.log('key: ' + val.key);
console.log('aa: ' + val.val);
Ответ 5
При работе с этой структурой, которая может считаться ассоциативным массивом, вам нужно использовать разные методы. Такие вещи, как pop(), slice() и даже .length, не будут работать так же, как при использовании числовых клавишных массивов.
Я использую строковые массивы объектов, когда поиск пары ключ/значение должен происходить быстро.
Здесь jsPef, который я только что создал, который показывает преимущество вашей структуры массива:
http://jsperf.com/bmcgin-object-array-tests (помните, что производительность идет вверх по мере увеличения массива)
Также помните, что значение может быть числом, строкой, массивом, функцией, объектом ect...