单线程从ES 6中的对象获取一些属性

如何编写一个function,在ES6中以最紧凑的方式只使用less量属性?

我已经想出解决scheme使用解构+简化的对象字面量,但我不喜欢在代码中重复的字段列表。

有更简单的解决scheme吗?

(v) => { let { id, title } = v; return { id, title }; } 

尽pipe这样做不能避免重复字段列表,但是这里更加简单。 它使用“参数解构”来避免v参数的需要。

 ({id, title}) => ({id, title}) 

EthanBrown的解决scheme是比较一般的。 这是一个更习惯的版本,它使用Object.assign和计算属性( [p]部分):

 function pick(o, ...props) { return Object.assign({}, ...props.map(prop => ({[prop]: o[prop]}))); } 

如果我们想要保留属性的属性,比如可configurable ,getter和setter,同时也省略不可枚举的属性,那么:

 function pick(o, ...props) { var has = p => o.propertyIsEnumerable(p), get = p => Object.getOwnPropertyDescriptor(o, p); return Object.defineProperties({}, Object.assign({}, ...props .filter(prop => has(prop)) .map(prop => ({prop: get(props)}))) ); } 

我不认为有什么办法可以使它比你的答案(或torazburo的)更紧凑,但基本上你要做的就是模仿Underscore的pick操作 。 在ES6中重新实现它会很容易:

 function pick(o, ...fields) { return fields.reduce((a, x) => { if(o.hasOwnProperty(x)) a[x] = o[x]; return a; }, {}); } 

那么你有一个方便的可重用function:

 var stuff = { name: 'Thing', color: 'blue', age: 17 }; var picked = pick(stuff, 'name', 'age'); 

解决这个问题的诀窍是翻转所采取的方法:从原始的对象原点开始,可以从他们想要提取的键开始。

使用Array#reduce one可以将所需的每个键存储在作为所述函数的initialValue传入的空对象中。

像这样:

 const orig = { id: 123456789, name: 'test', description: '…', url: 'https://…', }; const filtered = ['id', 'name'].reduce((result, key) => { result[key] = orig[key]; return result; }, {}); console.log(filtered); // Object {id: 123456789, name: "test"} 

TC39的对象rest/传播属性的build议将使这个漂亮的光环:

 let { x, y, ...z } = { x: 1, y: 2, a: 3, b: 4 }; z; // { a: 3, b: 4 } 

(它有创build您可能不需要的xyvariables的缺点。)

我有类似于伊桑布朗的解决scheme,但更短的pickfunction。 另一个函数pick2稍微长一点,但允许重新命名类似于ES6的属性。

 const pick = (o, ...props) => props.reduce((r, p) => p in o ? {...r, [p]: o[p]} : r, {}) const pick2 = (o, ...props) => props.reduce((r, expr) => { const [p, np] = expr.split(":").map( e => e.trim() ) return p in o ? {...r, [np || p]: o[p]} : r }, {}) 

以下是使用示例:

 const d = { a: "1", c: "2" } console.log(pick(d, "a", "b", "c")) // -> { a: "1", c: "2" } console.log(pick2(d, "a: x", "b: y", "c")) // -> { x: "1", c: "2" } 

我需要这种溶剂,但是我不知道提出的键是否可用。 所以,我采取了@torazaburo的答案,并改进了我的用例:

 function pick(o, ...props) { return Object.assign({}, ...props.map(prop => { if (o[prop]) return {[prop]: o[prop]}; })); } // Example: var person = { name: 'John', age: 29 }; var myObj = pick(person, 'name', 'sex'); // { name: 'John' }