Подтвердить что ты не робот

Использовать 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 ); 

Кажется, что это невозможно.

4b9b3361

Ответ 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...