【问题标题】:pick and omit in one function (lodash) in Redux action object在 Redux 操作对象的一个​​函数(lodash)中选择和省略
【发布时间】:2016-12-20 17:32:19
【问题描述】:

基本上我需要的是从 json 中获取“项目”并重新分配它,而其他键保持不变: 第一种方法复制数据。 第二个在性能方面似乎很糟糕。 第三个很难阅读和理解。 我使用 lodash。但如果不能以巧妙的方式完成,您可以向我推荐一个不同的库。

function a(name, json) {
    return {
        type: RECEIVE_DATA,
        name,
        items: _.get(json, 'data.items', []),
        receivedAt: Date.now(),
        ...json,
    };
}

function b(name, json) {
    return {
        ..._.omit(json, 'data'),
        type: RECEIVE_DATA,
        name,
        items: _.get(json, 'data.items', []),
        receivedAt: Date.now(),
    }
}

function c(name, json) {
    return {
        ..._.transform(json, (result, value, key) =>{
            if (key === 'data') {
                result['items'] = value['items'];
            } else {
                result[key] = value;
            }
        }, {}),
        type: RECEIVE_DATA,
        name,
        receivedAt: Date.now(),
    }
}

【问题讨论】:

    标签: javascript ecmascript-6 lodash


    【解决方案1】:

    使用参数destructuring获取items,使用rest properties收集其余参数:

    const json = { another: [], data: { items: [1] } };
    
    function a(name, { data, data: { items = [] }, ...jsonRest } = {}) {
      return {
        type: 'RECEIVE_DATA',
        name,
        items,
        receivedAt: Date.now(),
        ...jsonRest
      };
    }
                
    console.log(a('name', json));

    您还可以使用箭头函数稍微缩短动作创建器:

    const a = (name, { data, data: { items = [] }, ...jsonRest } = {}) => ({
        type: RECEIVE_DATA,
        name,
        items,
        receivedAt: Date.now(),
        ...jsonRest
    });
    

    【讨论】:

    • 现在有很多人使用传播对象语法。是否在任何地方都证实了 JavaScript 会真正得到它?
    • It is a Stage 3 proposal for ECMAScript.,一个非常流行的功能,所以我认为它会的。即使没有,我们也将永远拥有 Babel。
    • 现在所有的市长浏览器都支持参数解构:kangax.github.io/compat-table/es6/…(除非你想以 IE11 为目标,但在这种情况下,问题示例使用了不在 IE11 中的对象传播)
    【解决方案2】:

    如果您不介意在函数中添加几行代码,您可以轻松地从该键中获取数据,然后 delete 它:

    function a(name, json = {}) {
        const { items = [] } = json.data;
        delete json.data;
        return {
            type: RECEIVE_DATA,
            name,
            items,
            receivedAt: Date.now(),
            ...json,
        };
    }
    

    【讨论】:

    • 访问 'json.data' 很危险,因为它可能不存在!
    • @SashaTobin 我更新了我的答案以包含json 的默认对象值,如果json 是一个对象,那么使用它就没有危险。如果json 未定义或不是对象,那么它将失败(没有默认参数)
    • 为此更改参数是个坏主意:如果您希望 json 保持不变,a(name, json); c(name, json) 可能会中断。
    猜你喜欢
    • 2016-01-25
    • 1970-01-01
    • 2019-07-13
    • 1970-01-01
    • 1970-01-01
    • 2021-02-23
    • 2020-04-14
    • 1970-01-01
    • 2023-01-29
    相关资源
    最近更新 更多