私はガンを初めて使っています。私はパターンに基づいてオブジェクトの配列を非常に効果的に減らす既存のコードを持っています。私はGunのマップのコンテキストで実行するためにこれを微調整し、不一致のために未定義に戻すべきだと思っています。私は2つの引数も提供しなければならないと思います。そのうちの1つはwhere節であり、もう1つは返されたオブジェクトに表示されるプロパティです。私はまた、もし私が将来のマッチを使用すると、自動的に吐き出されるだろうと推測しています!私は正しい道にいますか?マップを使ってガンを減らす
const match = (object,key,value) => {
const type = typeof(value);
if(value && type==="object") {
return Object.keys(value).every(childkey =>
match(object[key],childkey,value[childkey]));
if(type==="function") return value(object[key]);
return object[key]===value;
}
const reduce = (objects,where) => {
const keys = Object.keys(where);
return objects.reduce((accumulator,current) => {
if(keys.every(key => match(current,key,where[key]))) {
accumulator.push(current);
}
return accumulator;
},[]);
}
let rows = reduce([{name: "Joe",address:{city: "Seattle"},age:25},
{name: "Mary",address:{city: "Seattle"},age:16},
{name: "Joe",address:{city: "New York"},age:20}],
{name:() => true,
address: {city: "Seattle"},
age: (age) => age > 10});
// で結果[{名: "ジョー"、アドレス:{都市: "シアトル"}、年齢:25}、{ 名: "メリー"、アドレス:{都市:「シアトル"}、年齢:16}]
これをさらに調べることで、以下のコードが作成されました。これは書式的には異なりますが、ガンの即応性の性質に準拠しています。しかし、ネストされたオブジェクトをどのように処理するかは不明です。以下のコードはプリミティブでのみ機能します。
const match = (object,key,value) => {
const type = typeof(value);
if(!object || typeof(object)!=="object") return false;
if(value && type==="object") {
const child = gun.get(object[key]["#"]);
for(let key in value) {
const value = {};
child.get(key).val(v => value[key] = v,{wait:0});
if(!match(value,key,value[key])) return;
}
}
if(type==="function") return value(object[key]);
return object[key]===value;
}
const gun = Gun(["http://localhost:8080/gun"]),
users = [{name: "Joe",address:{city: "Seattle"},age:25},
{address:{city: "Seattle"},age:25},
{name: "Mary",address:{city: "Seattle"},age:16},
{name: "Joe",address:{city: "New York"},age:20}];
//gun.get("users").map().put(null);
for(let user of users) {
const object = gun.get(user.name).put(user);
gun.get("users").set(object);
}
gun.get("users").map(user => {
const pattern = {name: (value) => value!=null, age: (age) => age > 20}; //, address: {city: "Seattle"}
for(let key in pattern) {
if(!match(user,key,pattern[key])) return;
}
return user;
}).on(data => console.log(data));
パターンを使ってフィルタリングするマップを作成したことは、プリミティブ値の場合はかなり簡単です。挑戦はネストされたオブジェクトと一致するようです。 – AnyWhichWay
mutli-valueとネストされた値のマッチングは、これからベースとして "構築"することができますが、SQL/Mangoのクエリの例が出るまで、そうです。単純な/即時の "out of the box"例。これは、擬似コードであるが、全体のアイデアを取得する必要があります '' ' Gun.chain.match =機能(クエリ、CB)を{ VARガン=この; var fields = Object.keys(query); var check = {}; fields.forEach(function(field){ check [field] = true; gun.get(フィールド).val(関数(val){ if(val!== query [field]){return} check [フィールド] = FALSE; は//すべてのチェックが行わCB() }); })。 } '' ' – marknadal