2017-04-07 68 views
-1

我在JS两个对象对象连接在一起地图在JS(ES6)

positions: { 
    top: { top: 10, left: 10 }, 
    bottom: { top: 10, left: 10 }, 
    left: { top: 10, left: 10 }, 
    right: { top: 10, left: 10 }, 
}, 

positionAdjustments: { 
    top: { top: 0, left: 0 }, 
    bottom: { top: 5, left: 5 }, 
    left: { top: 0, left: 0 }, 
    right: { top: 0, left: 0 }, 
}, 

我想将它们结合起来,以产生,例如: -

positions: { 
    top: { top: 10, left: 10 }, 
    bottom: { top: 15, left: 15 }, 
    left: { top: 10, left: 10 }, 
    right: { top: 10, left: 10 }, 
}, 

是否有lodash方法或一些优雅的方式来实现这一点,而不写一些递归映射函数?例如:如果

positions.deepCombineValues(positionAdjustments);

+0

为什么最后'left'是'0'? – ozil

+0

可能是一个错字 – beniutek

+0

@ ozil sry是一个错字! –

回答

0
keys = Object.keys(positions) 
const result = keys.map(key => (
    { 
    top: positions[key].top + positionsAdjustments[key].top, 
    left: positions[key].left + positionsAdjustments[key].left, 
    } 
)); 

这就是你不想使用lodash,只有具备topleftrightbottom对象中topleft键。可以probaly改善这种方式更多

+1

也谢谢!我希望lodash有一个内置的这种东西(在对象中加入键值),但我不认为它是这样,猜测它太具体了 –

1

您可以迭代键和所需的属性,并调整位置。

var object = { positions: { top: { top: 10, left: 10 }, bottom: { top: 10, left: 10 }, left: { top: 10, left: 10 }, right: { top: 10, left: 10 } }, positionAdjustments: { top: { top: 0, left: 0 }, bottom: { top: 5, left: 5 }, left: { top: 0, left: 0 }, right: { top: 0, left: 0 } } }; 
 

 
Object.keys(object.positions).forEach(function (k) { 
 
    ['top', 'left'].forEach(function (l) { 
 
     object.positions[k][l] += (object.positionAdjustments[k] || {})[l] || 0; 
 
    }); 
 
}) 
 

 
console.log(object.positions);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+1

Niiice!谢谢 –