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

标签 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 原则,在两行上重复每个菜谱的名称。所以,我的问题是,是否有任何聪明的方法可以使用解构(或其他任何与此相关的方法)将一个对象属性的子集应用于另一个对象,而不必重复每个属性两次?或者我的最后一个例子已经足够好吗?

最佳答案

如果可以使用库,那么 pick 可能会更短。

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

Docs on lodash pick

关于javascript - 是否有更好/更短的模式来在另一个对象上设置对象属性的子集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40567875/

相关文章:

javascript - 为什么这个检查所有复选框的 jQuery 代码不起作用?

javascript - 透明图像始终位于 Canvas 之上。在透明图像后面绘制

javascript - Zoho CRM SDK - 如何在加载时触发功能?

javascript - 如何在puppeteer page.evaluate中使用url模块

javascript - 嵌套菜单停止触发未直接点击<li>s

javascript - 为什么在使用默认的拒绝定义时我们会得到 Uncaught(在 promise 中),但在解决时却不是这样?

javascript - 为什么在 Javascript 中不鼓励在 while 语句中赋值?

javascript - 如何添加向上箭头以选择元素以及向下箭头并仅使用这些箭头遍历选项?

javascript - CSS - 悬停时向左移动图像一点点,如果没有悬停则返回原始位置

javascript - 单击特定按钮以显示特定 ID