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

将pop()与JavaScript关联数组一起使用,javascript,arrays,object,associative-array,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 ); 这似乎是不可能的。你是对的,这是不可能的。将对象视为映射或哈希表,而不是“关联数组”。属性没有顺序,因此

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

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

var val = deck.pop();


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

这似乎是不可能的。

你是对的,这是不可能的。将对象视为映射哈希表,而不是“关联数组”。属性没有顺序,因此像
.pop
这样的方法没有意义(当然,除非它删除随机属性,比如Python的字典)

如果要使用
.pop
val.key
val.val
,则必须创建对象数组:

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

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

正如其他答案所建议的,这里最好的解决方案可能是使用对象数组。但是,您也可以创建自己的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);

您可以向
对象.prototype
添加一个类似的
pop
函数,这样您就可以执行
deck.pop()
,但我强烈建议不要使用这种类型的设计。

我相信您知道,
.pop
是一种原型
数组
方法,因此您不能将其用于Javascript对象

对数组调用
.pop
将从数组中删除最后一个元素。但是,对象没有“最后”键值对,因为它们的顺序永远无法保证。尽管如此,如果您不关心顺序,您可以实现一个类似于
.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);

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

当需要快速搜索键/值对时,我使用字符串键控对象数组

下面是我刚刚创建的jsPef,它显示了数组结构的优点:

(请记住,阵列越大,性能越高)


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

为什么不建议使用这些结构?在某些情况下,它们提供最高级别的性能,例如,当您需要知道cardQ
var x=deck['cardQ']的值时比在数组中循环查找对象快得多。@BrianMcGinity这通常是一种不好的做法,会破坏封装。目前,它只会为…中断
。。。在
中,除非选中
Object.hasOwnProperty.call(obj,key)
,否则将列出Object.prototype.addedStuff作为您的Object.prototype。。。in
一开始就不好(不检查hasOwnproperty),但它仍然破坏了封装。您正在更改JavaScript内置原型,它们不是您可以更改的。@HMR,我的意思是可以使用按字符串索引的对象数组,在许多情况下,它比按数字索引的对象数组更受欢迎。我并不是想暗示重新定义prototye pop()或任何原型是个好主意。已经提前20分钟提供了。@FelixKling如果我认为我的答案不够深入,我会删除它。在我看来,这比你想象的更有价值。这不是很危险吗?我认为这不安全。虽然它在大多数情况下都可以工作,但我不认为您可以假设返回中的第一项是添加到数组中的最后一项。您可能希望实现一个“键控”堆栈,以便知道pop工作正常。Pop应始终删除并为您提供添加到阵列中的最后一项。按和int索引时很容易,但键/相不是这样做的。