我知道this existing question但是我只对普通的javascript解决方案感兴趣(没有像lodash这样的外部库)。
什么是最干净的方式(包括所有ES6的善良和超越 - 如对象休息和传播等)从javascript中获取具有来自另一个对象的道具子集的对象?
假设我想从foo
对象中选择bar
,baz
和source
。
我目前有两个解决方案,我不喜欢它们:
1
const result = {
foo: source.foo,
bar: source.bar,
baz: source.baz
};
2
const { foo, bar, baz } = source;
const target = { foo, bar, baz };
第二个更短但是它会用一些变量污染当前执行范围,并且它们的列表无论如何都必须写入两次。
PS。我也不想用一些辅助方法扩充Object.prototype
或调用一些自定义函数来实现这一点。
答案 0 :(得分:2)
你可以使用具有破坏性的IIFE。
const source = { foo: 1, bar: 2, baz: 3 },
target = (({ foo, bar, baz }) => ({ foo, bar, baz }))(source);
console.log(target);
答案 1 :(得分:1)
如果你有一个包含你需要的许多属性的对象,而有一些你不需要的属性,你可以使用object rest syntax:
const source = { foo: 1, bar: 2, baz: 3, whatever: 4 };
const { whatever, ...target } = source;
console.log(target);
注意 - 对象休息是ECMAScript的第3阶段提案,需要转发器(带有Object rest spread transform的babel)。
答案 2 :(得分:0)
您可以使用解构分配
const source = {foo: 1, bar:2, baz:3, abc: 4, def: 5};
const result = {};
({foo:result.foo, bar:result.bar, baz:result.baz} = source);
console.log(result);

或者,您可以将属性名称设置为数组的元素,使用带有解构赋值的for..of
循环来设置属性,值target
const source = {foo: 1, bar:2, baz:3, abc:4, def: 5};
const result = {};
for (let prop of ["foo", "bar", "baz"]) ({[prop]:result[prop]} = source);
console.log(result);