单行代码,用于从 ES 6 中的对象中获取某些属性
2022-08-30 02:05:55
如何编写一个函数,在ES6中以最紧凑的方式只占用很少的属性?
我已经想出了使用解构+简化对象文字的解决方案,但我不喜欢在代码中重复字段列表。
有没有更精简的解决方案?
(v) => {
let { id, title } = v;
return { id, title };
}
如何编写一个函数,在ES6中以最紧凑的方式只占用很少的属性?
我已经想出了使用解构+简化对象文字的解决方案,但我不喜欢在代码中重复字段列表。
有没有更精简的解决方案?
(v) => {
let { id, title } = v;
return { id, title };
}
这里有一些更苗条的东西,尽管它不能避免重复字段列表。它使用“参数解构”来避免对参数的需求。v
({id, title}) => ({id, title})
(请参阅此其他答案中的可运行示例)。
@EthanBrown的解决方案更通用。下面是它的一个更惯用的版本,它使用 和计算属性(部分):Object.assign
[p]
function pick(o, ...props) {
return Object.assign({}, ...props.map(prop => ({[prop]: o[prop]})));
}
如果我们想保留属性的属性,例如 getter 和 setters,同时省略不可枚举的属性,那么:configurable
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的拾取
操作。在ES6中重新实现它很容易:
function pick(o, ...fields) {
return fields.reduce((a, x) => {
if(o.hasOwnProperty(x)) a[x] = o[x];
return a;
}, {});
}
然后你有一个方便的可重用功能:
var stuff = { name: 'Thing', color: 'blue', age: 17 };
var picked = pick(stuff, 'name', 'age');