2017-08-07 60 views
0

我以前从未使用过代理服务器,但我认为应该可以将对象集合“合并”为单个对象。 它需要保持“活”状态,因为原始字段将对其执行值更改。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

这可能吗?

回答

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)

+0

谢谢您的帮助。这很好。 – Simon

1

这里是代理目标为空对象的解决方案(如果数组是代理,该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)

+0

'for(let i in prox){console.log(i,prox [i])}''''''代理上的ownKeys:陷阱结果不包含长度。 – Simon

+0

@Simon - 也许我误解了你想达到的目标,我从你的codepen中取得了循环。长度是一个数组属性,如果你想要一个数组,你将不会拥有枚举属性。如果你更新你的问题的具体细节,我会更新我的答案 – mikeapr4