Javascript将集合代理到单个对象

时间:2017-08-07 11:53:42

标签: javascript ecmascript-6

我之前从未使用过代理,但我认为应该可以"合并"将对象集合到单个对象中。 它需要保持"生活"因为原始字段会对它们执行值更改。

在此阶段忽略关键碰撞:

鉴于:

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

有可能吗?

2 个答案:

答案 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)