2016-12-24 137 views
5

我知道this existing question然而我只对普通的javascript解决方案感兴趣(没有像lodash这样的外部库)。获取对象与另一个对象的属性的子集

什么是最彻底的方法(包括所有ES6善良与超越 - 状物体休息&传播等),以获得与道具与JavaScript中另一个对象的子集的对象?

假设我想从source对象中挑选foobarbaz。 我目前有两种解决方案,我想他们都没有:

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

什么是第一种方法的问题? – guest271314

回答

1

如果你有包含你需要很多属性的对象,及少量不这样做,你可以使用object rest syntax

const source = { foo: 1, bar: 2, baz: 3, whatever: 4 }; 
 

 
const { whatever, ...target } = source; 
 

 
console.log(target);

注意 - 对象休息是ECMAScript的第3阶段建议,并且需要一个转译器(babel,Object rest spread transform)。

2

你可以使用一个破坏的IIFE。

const source = { foo: 1, bar: 2, baz: 3 }, 
 
     target = (({ foo, bar, baz }) => ({ foo, bar, baz }))(source); 
 

 
console.log(target);

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);