我试图确定是否有更好/更短的方法来获取对象的属性子集并将(仅)这些属性添加到另一个对象。显然,这不是世界上最重要的事情,但由于我经常这样做,所以找出理想的模式会很好。
我们说我有一个对象,例如
const cheesyRecipes = {
cheesyBread: ...,
grilledCheeseSandwich: ...,
macAndCheese: ...,
...
}
我希望将该对象的子集应用于另一个对象,例如
const cheesyBreadRecipes = {};
// do something with cheesyRecipes?
cheesyBreadRecipes; // == {cheesyBread, grilledCheeseSandwich}
我看到了一些我可以做到的方法。我可以走老派的路......
const cheesyRecipesWithBread = [`cheesyBread`, `grilledCheeseSandwhich`];
for(var i = 0; i < cheesyRecipesWithBread.length; i++) {
const recipeName = cheesyRecipesWithBread[i];
cheesyBreadRecipes[recipeName] = cheesyRecipes[recipeName];
});
或者我可以得到一点点发烧友并使用reduce
...
[`cheesyBread`, `grilledCheeseSandwhich`].reduce((memo, recipeName) => {
memo[recipeName] = cheesyRecipes[recipename];
return memo;
}, cheesyBreadRecipes);
或者我可以通过使用ES6解构来获得更好的成绩并将行数减半...
const {cheesyBread, grilledCheeseSandwhich} = cheesyRecipes;
Object.apply(cheesyBreadRecipes, {cheesyBread, grilledCheeseSandwhich});
但即便是最后一个,显然是最短的,似乎违反了DRY原则,在两条线上重复了每个食谱的名称。所以,我的问题是,是否有任何聪明的方法可以使用解构(或其他任何事情)将一个对象的属性的子集应用于另一个,而不必重复每个属性两次?或者我的最后一个例子是好的吗?
答案 0 :(得分:1)
如果使用库可以,则选择可以更短。
ver newObj = _.pick(oldObj, ['cheesyBread', 'grilledCheeseSandwhich'])