是否有更好/更短的模式用于在另一个对象上设置对象属性的子集?

时间:2016-11-12 21:31:34

标签: javascript

我试图确定是否有更好/更短的方法来获取对象的属性子集并将(仅)这些属性添加到另一个对象。显然,这不是世界上最重要的事情,但由于我经常这样做,所以找出理想的模式会很好。

我们说我有一个对象,例如

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原则,在两条线上重复了每个食谱的名称。所以,我的问题是,是否有任何聪明的方法可以使用解构(或其他任何事情)将一个对象的属性的子集应用于另一个,而不必重复每个属性两次?或者我的最后一个例子是好的吗?

1 个答案:

答案 0 :(得分:1)

如果使用库可以,则选择可以更短。

ver newObj = _.pick(oldObj, ['cheesyBread', 'grilledCheeseSandwhich'])

Docs on lodash pick