单线程从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您可能不需要的x
和y
variables的缺点。)
我有类似于伊桑布朗的解决scheme,但更短的pick
function。 另一个函数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' }