Python では、int を値として格納する defaultdict(int) を使用できます。また、ディクショナリに存在しないキーで「get」を実行しようとすると、デフォルト値としてゼロが取得されます。
javascript/jqueryで同じことができますか
Python では、int を値として格納する defaultdict(int) を使用できます。また、ディクショナリに存在しないキーで「get」を実行しようとすると、デフォルト値としてゼロが取得されます。
javascript/jqueryで同じことができますか
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]]
プロキシは間違いなく構文を最も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
、リーフ ノードの既定値を返す関数を受け入れます。構造体の基本的な操作はput
とget
で、後者は一目瞭然です。put
ネストされたキーのチェーンを生成し、これらのキーの末尾にあるリーフ ノードを変更または設定できる関数のペアを返します。アクセス.root
すると、基礎となるMap
構造が得られます。
バグを見落としたり、便利な機能を見逃したりした場合は、遠慮なくコメントを残してください。