Javascript代理集合到单个对象
问题描述:
我以前从未使用过代理服务器,但我认为应该可以将对象集合“合并”为单个对象。 它需要保持“活”状态,因为原始字段将对其执行值更改。Javascript代理集合到单个对象
忽略在这一阶段关键的碰撞:
考虑:
const fields = [{
name: 'hello',
value: 1
},{
name: 'goodbye',
value : 2
}];
输出:
const proxy = { hello:1 , goodbye :2 }
我一定要能够遍历与for in
代理对象。
这里开始的钢笔,但没有得到很远:https://codepen.io/anon/pen/mMRaKw?editors=1111
这可能吗?
答
我认为你正在寻找的东西,如:
const fields = [{name: 'hello',value: 1}, { name: 'goodbye', value: 2}];
let handler = {
get: function(target, name) {
if (name === 'flatten') {
return target.reduce((a, c) => {
a[c.name] = c.value;
return a
}, {});
} else {
return target[name];
}
},
set: function(target, prop, value) {
let obj = target.find(o => o.name === prop);
if(obj) {
obj.value = value;
return true;
}
return false;
}
};
let prox = new Proxy(fields, handler);
console.log('flat obj', JSON.stringify(prox.flatten))
// update original
fields[0].value=10;
// change reflected in proxy
console.log('flatten.hello',prox.flatten.hello);
// update proxy
prox.goodbye = 200;
// change reflected in original
console.log('original', fields[1].value)
答
这里是代理目标为空对象的解决方案(如果数组是代理,该for in
将迭代编号项)。
const fields = [{name: 'hello',value: 1}, { name: 'goodbye', value: 2}];
let handler = {
get: function(target, name) {
var f = fields.find(f => f.name === name);
return f && f.value;
},
ownKeys: function(target) {
return fields.map(f => f.name);
},
getOwnPropertyDescriptor: function(target, prop) {
return { configurable: true, enumerable: true };
}
};
let prox = new Proxy({}, handler);
// update original
fields[0].value=10;
// change reflected in proxy
console.log('proxy.hello',prox.hello);
for(let i in prox){
console.log(i)
console.log(prox[i])
}
console.log(prox)
谢谢您的帮助。这很好。 – Simon