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);
他の回答で示唆されているように、ここでの最善の解決策は、オブジェクトの配列を使用することかもしれません。ただし、次のように、オブジェクトからキーを削除する独自のポップ関数を作成することもできます。
_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()
を実行することもできますが、そのタイプの設計には強くお勧めしません。
あなたは正しいです、それは不可能です。オブジェクトを「連想配列」ではなく、マップまたはハッシュテーブルとして参照してください。プロパティには順序がないため、.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);
連想配列と考えることができるこの構造を操作するときは、さまざまな手法を使用する必要があります。 pop()、slice()、さらには.lengthのようなものは、数値キー配列の場合とは異なり、機能しません。
キーと値のペアをすばやく検索する必要がある場合は、文字列キーのオブジェクト配列を使用します。
これが私が作成したばかりのjsPefで、配列構造の利点を示しています。
http://jsperf.com/bmcgin-object-array-tests (配列が大きくなるとパフォーマンスが大幅に向上することに注意してください)
また、値には数値、文字列、配列、関数、オブジェクトなどがあります。