【发布时间】:2017-05-22 21:04:56
【问题描述】:
我是枪新手。我现有的代码可以非常有效地减少基于模式的对象数组。我在想我应该调整它以在 Gun 的 .map 上下文中运行,并为不匹配返回 undefined 。我想我还必须提供两个参数,其中一个是 where 子句,另一个是我希望在返回的对象上显示的属性。我还假设如果我使用 .on 未来的比赛会自动吐出!我走对了吗?
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}]
对此的进一步探索产生了以下代码,该代码在风格上有所不同,但符合 Gun 的即时响应特性。但是,目前还不清楚如何处理嵌套对象。下面的代码仅适用于原语。
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));
【问题讨论】:
标签: gun