web-dev-qa-db-ja.com

JavaScript連想配列でpop()を使用する

JSで次のようなことをするにはどうすればよいですか?配列ではなくオブジェクトで.pop()を模倣したいと思います。

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

var val = deck.pop();


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

それは不可能のようです。

13

.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);
17
Ethan Brown

他の回答で示唆されているように、ここでの最善の解決策は、オブジェクトの配列を使用することかもしれません。ただし、次のように、オブジェクトからキーを削除する独自のポップ関数を作成することもできます。

_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()を実行することもできますが、そのタイプの設計には強くお勧めしません。

4
Andrew Clark

あなたは正しいです、それは不可能です。オブジェクトを「連想配列」ではなく、マップまたはハッシュテーブルとして参照してください。プロパティには順序がないため、.popなどのメソッドは意味がありません(もちろん、Pythonの辞書のようにランダムなプロパティを削除しない限り)。

.popval.keyval.valを使用する場合は、代わりにオブジェクトの配列を作成する必要があります。

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

ご存じのとおり、.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);
1
Walter Roman

連想配列と考えることができるこの構造を操作するときは、さまざまな手法を使用する必要があります。 pop()、slice()、さらには.lengthのようなものは、数値キー配列の場合とは異なり、機能しません。

キーと値のペアをすばやく検索する必要がある場合は、文字列キーのオブジェクト配列を使用します。

これが私が作成したばかりのjsPefで、配列構造の利点を示しています。

http://jsperf.com/bmcgin-object-array-tests (配列が大きくなるとパフォーマンスが大幅に向上することに注意してください)

また、値には数値、文字列、配列、関数、オブジェクトなどがあります。

1
Brian McGinity