猿问

从es 6中的对象获取一些属性的一行程序。

从es 6中的对象获取一些属性的一行程序。

如何编写函数,在ES6中以最紧凑的方式只使用很少的属性?

我已经想出了使用析构+简化对象文字的解决方案,但是我不喜欢在代码中重复这个字段列表。

有没有更苗条的解决方案?

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


LEATH
浏览 1195回答 4
4回答

ibeautiful

这里有一些更轻巧的东西,尽管它不能避免重复字段列表。它使用“参数析构”来避免对v参数。({id, title}) => ({id, title})@Ethan Brown的解决方案更为普遍。下面是一个更地道的版本,它使用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)})))     );}

宝慕林4294392

我不认为有什么办法比你的答案(或者托拉兹布的答案)更简洁,但实际上你想要做的是模仿下划线pick操作。在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');

一只斗牛犬

解决这一问题的诀窍是翻转所采取的方法:而不是从原始对象开始。orig,你可以从他们想要提取的钥匙开始。使用Array#reduce然后,可以将每个所需的密钥存储在空对象上,该对象作为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"}

元芳怎么了

使用逗号运算符的更短一点的解决方案:const pick = (O, ...K) => K.reduce((o, k) => (o[k]=O[k], o), {})
随时随地看视频慕课网APP
我要回答