将pop()与JavaScript关联数组一起使用

时间:2014-02-20 06:21:35

标签: javascript arrays object associative-array

如何在JS中执行以下操作?我想模仿.pop()对象而不是数组。

var deck = { 
    'cardK' :'13',
    'cardQ' :'12',
    'cardAJ':'11'
};

var val = deck.pop();


console.log("Key" + val.key ); 
console.log("Value" + val.val ); 

似乎不可能。

5 个答案:

答案 0 :(得分:17)

.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);

答案 1 :(得分:4)

正如其他答案所建议的,这里最好的解决方案可能是使用一组对象。但是,您也可以创建自己的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(),但我强烈建议不要使用此类设计。

答案 2 :(得分:3)

你是对的,这是不可能的。将对象视为地图哈希表,而不是“关联数组”。属性没有顺序,因此诸如.pop之类的方法没有意义(除非它会删除随机属性,如Python的字典)。

如果您想使用.popval.key以及val.val,则必须创建一个对象数组:

var deck = [
  {key: 'cardK', val: '13'},
  {key: 'cardQ', val: '12'},
  {key: 'cardAJ', val: '11'}
];

答案 3 :(得分:1)

我相信您知道,.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);

答案 4 :(得分:1)

使用此结构(可以将其视为关联数组)时,需要使用不同的技术。像pop(),slice()甚至.length这样的东西不会像使用数字键控数组那样工作。

我在搜索需要快速发生的键/值对时使用字符串键控对象数组。

这是我刚创建的一个jsPef,它显示了数组结构的好处:

http://jsperf.com/bmcgin-object-array-tests(请记住,随着阵列变大,性能会上升)

还要记住,值可以是数字,字符串,数组,函数,对象等...