web-dev-qa-db-ja.com

(ES6 / ES7で_.merge)未定義の値をオーバーライドせずにObject.assign

Lodashには _。merge 機能があります。 ES6でもES7でも同じことを実現したい。

このスニペットを持っている:

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

{key: 2}を受け取りたいです。現在、私は{key: undefined}を受け取ります

これは[〜#〜]ではありません[〜#〜]ディープマージです。

出来ますか?はいの場合、それを達成する方法は?

17
Filip Bartuzi

Object.assignを直接使用しても、これを実現することはできません。これは、次の各オブジェクトが前のマージで同じキーを書き換えるためです。手作りの機能で入ってくるオブジェクトをフィルタリングする唯一の方法。

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

Object.assign()に渡す前に、undefined値を持つキーを単純に除外できます。

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}))

未定義の値を削除するための小さなユーティリティを作成します。

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
user663031