我该如何在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
只能在数组上使用。在 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);
您可以在Object.prototype
中添加类似的pop
函数,以便可以执行deck.pop()
,但我强烈建议不要采用这种设计。
.pop
这样的方法是没有意义的(除非它会删除一个随机属性,就像Python的字典一样)。.pop
和val.key
和val.val
,则必须创建一个对象数组:var deck = [
{key: 'cardK', val: '13'},
{key: 'cardQ', val: '12'},
{key: 'cardAJ', val: '11'}
];
.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);
var x = deck['cardQ'];
比循环数组并查找对象要快得多。 - Brian McGinityfor ... in
,因为你的 Object.prototype.addedStuff 会被列出,除非你检查Object.hasOwnProperty.call(obj,key)
,有些人认为使用for ... in
本来就不好(没有检查 hasOwnproperty),但它仍然会破坏封装性。你正在更改 JavaScript 内置的原型,它们不属于你自己去更改。 - HMR