ES6传播语法:自动跳过空键?

时间:2019-10-09 19:02:19

标签: javascript ecmascript-6

如果有效负载中的键之一为空,则避免更新输入的更简单的模式是什么? 有没有不错的ES6语法?

const master = {
    inputs: {a: [], b: [], c: []}
};

const {a, b, c} = payload;

const updateMaster = (payload) => ({
    ...master, inputs: {...master.inputs, ...payload}
});

2 个答案:

答案 0 :(得分:2)

您可以创建一个这样的函数。它将直接删除对象中的所有空值,而无需直接修改传递给函数的对象。

const removeEmpty = obj => {
  return Object.keys(obj).reduce((acc, key) => {
    // value is "falsey" or is empty array
    return !obj[key] || (Array.isArray(obj[key]) && !obj[key].length)
      ? acc
      : {...acc, [key]: obj[key]}
  }, {})
}

console.log(removeEmpty({a: 'AAA', b: '', c: 'CCC', d: false, e: null, f: [1,2], g: []}))

因此,您的最终摘要如下:

const updateMaster = (payload) => ({
    ...master, inputs: {...master.inputs, ...removeEmpty(payload)}
});

答案 1 :(得分:2)

要过滤对象的字段,请使用Object.entries检索字段,然后使用Array.prototype.filter进行过滤,然后使用Object.formEntries从过滤后的条目中重建对象。

let payload = {
  a: [],
  b: [1, 2]
};

let nonEmptyPayload = Object.fromEntries(Object.entries(payload).filter(([_, v]) => v.length))

console.log(nonEmptyPayload);

将此应用于您的示例

let master = {
  inputs: {
    a: [],
    b: [13, 14],
    c: [10, 12]
  }
};

let trimObj = obj => Object.fromEntries(Object.entries(obj).filter(([_, v]) => v.length));

let updateMaster = payload => ({
  ...master,
  inputs: { ...master.inputs,
    ...trimObj(payload)
  }
});

updateMaster({
  b: [15, 16], // Will override master.c
  c: []        // Will not override master.c
});

console.log(master);