39

Python では、int を値として格納する defaultdict(int) を使用できます。また、ディクショナリに存在しないキーで「get」を実行しようとすると、デフォルト値としてゼロが取得されます。

javascript/jqueryで同じことができますか

4

7 に答える 7

18

pycollections.jsをチェックしてください:

var collections = require('pycollections');

var dd = new collections.DefaultDict(function(){return 0});
console.log(dd.get('missing'));  // 0

dd.setOneNewValue(987, function(currentValue) {
  return currentValue + 1;
});

console.log(dd.items()); // [[987, 1], ['missing', 0]]
于 2015-07-18T00:39:15.387 に答える
1

プロキシは間違いなく構文を最もPythonに似たものにし、ネストされた/再帰的な defaultdictsをサポートするかなり鮮明で完全なプロキシベースの実装のように見えるdefaultdict2というライブラリがあります。このスレッドで。

そうは言っても、私は、この概念実証のような関数ベースのアプローチを使用して、JS をもう少し「バニラ」/「ネイティブ」に保つことを好む傾向があります。

class DefaultMap {
  constructor(defaultFn) {
    this.defaultFn = defaultFn;
    this.root = new Map();
  }
  
  put(...keys) {
    let map = this.root;
    
    for (const key of keys.slice(0, -1)) {
      map.has(key) || map.set(key, new Map());
      map = map.get(key);
    }

    const key = keys[keys.length-1];
    map.has(key) || map.set(key, this.defaultFn());
    return {
      set: setterFn => map.set(key, setterFn(map.get(key))),
      mutate: mutationFn => mutationFn(map.get(key)),
    };
  }
  
  get(...keys) {
    let map = this.root;

    for (const key of keys) {
      map = map?.get(key);
    }

    return map;
  }
}

// Try it:
const dm = new DefaultMap(() => []);
dm.put("foo").mutate(v => v.push(1, 2, 3));
dm.put("foo").mutate(v => v.push(4, 5));
console.log(dm.get("foo")); // [1, 2, 3, 4, 5]
dm.put("bar", "baz").mutate(v => v.push("a", "b"));
console.log(dm.get("bar", "baz")); // ["a", "b"]
dm.put("bar", "baz").set(v => 42);
console.log(dm.get("bar", "baz")); // 42
dm.put("bar", "baz").set(v => v + 1);
console.log(dm.get("bar", "baz")); // 43

のコンストラクターはDefaultMap、リーフ ノードの既定値を返す関数を受け入れます。構造体の基本的な操作はputgetで、後者は一目瞭然です。putネストされたキーのチェーンを生成し、これらのキーの末尾にあるリーフ ノードを変更または設定できる関数のペアを返します。アクセス.rootすると、基礎となるMap構造が得られます。

バグを見落としたり、便利な機能を見逃したりした場合は、遠慮なくコメントを残してください。

于 2021-04-16T23:28:13.717 に答える