将pop()与JavaScript关联数组一起使用
如何在JS中执行以下操作?我想在对象而不是数组上模拟将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 ); 这似乎是不可能的。你是对的,这是不可能的。将对象视为映射或哈希表,而不是“关联数组”。属性没有顺序,因此
.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索引时很容易,但键/相不是这样做的。