(_.merge in ES6 / ES7)Object.assign没有覆盖未定义的值

时间:2016-10-11 12:26:06

标签: javascript ecmascript-6 lodash babel ecmascript-7

lodash中有_.merge个功能。我想在ES6或ES7中实现同样的目标。

有这个片段:

Object.assign({}, {key: 2}, {key: undefined})

我想收到{key: 2}。目前我收到了{key: undefined}

这是 NOT 深度合并。

有可能吗?如果是,那么如何实现呢?

6 个答案:

答案 0 :(得分:9)

直接使用Object.assign无法实现这一点,因为每个下一个对象都会为prev merge重写相同的键。唯一的方法是使用一些手工制作的功能过滤传入的对象。

function filterObject(obj) {
    const ret = {};
    Object.keys(obj)
        .filter((key) => obj[key] !== undefined)
        .forEach((key) => ret[key] = obj[key]);
    return ret;
}

答案 1 :(得分:9)

您只需使用undefined值过滤掉密钥,然后再将其传递给Object.assign()



const assign = (target, ...sources) =>
  Object.assign(target, ...sources.map(x =>
    Object.entries(x)
      .filter(([key, value]) => value !== undefined)
      .reduce((obj, [key, value]) => (obj[key] = value, obj), {})
  ))

console.log(assign({}, {key: 2}, {key: undefined}))




答案 2 :(得分:3)

编写一个小实用程序来删除未定义的值:

function removeUndefined(obj) {
  for (let k in obj) if (obj[k] === undefined) delete obj[k];
  return obj;
}

然后

Object.assign({}, {key: 2}, removeUndefined({key: undefined}))

这似乎比使用有线行为编写自己的assign以删除未定义的值更好。

答案 3 :(得分:0)

使用lodash省略nil个值,然后通过传播将两个对象组合为一个

{ ...(omitBy({key: 2}, isNil)), ...(omitBy({key: undefined}, isNil))}

https://lodash.com/docs/4.17.15

上查看lodash的更多信息

答案 4 :(得分:0)

使用 ES2019/ES10 的新对象方法 Object.fromEntries(),可以更新 Michał 的 answer

const assign = (target, ...sources) =>
  Object.assign(target, ...sources.map(x =>
    Object.fromEntries(
      Object.entries(x)
        .filter(([key, value]) => value !== undefined)
    )
  ))

console.log(assign({}, {key: 2}, {key: undefined}))

答案 5 :(得分:0)

如果你只需要值而不需要对象,你也可以使用对象解构:

const input = { a: 0, b: "", c: false, d: null, e: undefined };
const { a = 1, b = 2, c = 3, d = 4, e = 5, f = 6 } = input;
console.log(a, b, c, d, e, f);
// => 0, "", false, null, 5, 6

这只会覆盖不存在或未定义的值。

我经常将其用于函数参数默认值,如下所示:

function f(options = {}) {
  const { foo = 42, bar } = options;
  console.log(foo, bar);
}

f();
// => 42, undefined

f({})
// => 42, undefined

f({ foo: 123 })
// => 123, undefined

f({ bar: 567 })
// => 42, 567

f({ foo: 123, bar: 567 })
// => 123, 567