我之前从未使用过代理,但我认为应该可以"合并"将对象集合到单个对象中。 它需要保持"生活"因为原始字段会对它们执行值更改。
在此阶段忽略关键碰撞:
鉴于:
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
有可能吗?
答案 0 :(得分:1)
这是一个将Proxy目标作为空对象的解决方案(如果代理了数组,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)

答案 1 :(得分:0)
我认为你正在寻找类似的东西:
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)