在Redux操作对象中的一个函数(lodash)中选择和省略

时间:2016-12-20 17:32:20

标签: javascript ecmascript-6 lodash

基本上我需要的是从json获取“items”并重新分配它,并保持其他键不变: 第一种方法重复数据。 第二个似乎在性能方面表现不佳。 第三个是难以阅读和理解的。 我用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(),
    }
}

2 个答案:

答案 0 :(得分:0)

使用参数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
});

答案 1 :(得分:0)

如果您不介意在函数中添加更多行,则可以轻松地从该键中获取数据,然后delete

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