为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

从es 6中的对象获取一些属性的一行程序。如何编写函数,在ES6中以最紧凑的方式只使用很少的属性?我已经想出了使用析构+简化对象文字的解决方案,但是我不喜欢在代码中重复这个字段列表。有没有更苗条的解决方案?(v) => {     let { id, title } = v;     return { id, title };}
查看完整描述

4 回答

?
ibeautiful

TA贡献1993条经验 获得超5个赞

这里有一些更轻巧的东西,尽管它不能避免重复字段列表。它使用“参数析构”来避免对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)})))
    );}


查看完整回答
反对 回复 2019-05-30
?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

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


查看完整回答
反对 回复 2019-05-30
?
一只斗牛犬

TA贡献1784条经验 获得超2个赞

解决这一问题的诀窍是翻转所采取的方法:而不是从原始对象开始。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"}


查看完整回答
反对 回复 2019-05-30
?
元芳怎么了

TA贡献1798条经验 获得超7个赞

使用逗号运算符的更短一点的解决方案:

const pick = (O, ...K) => K.reduce((o, k) => (o[k]=O[k], o), {})


查看完整回答
反对 回复 2019-05-30
  • 4 回答
  • 0 关注
  • 1158 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信