Lodashには _。merge 機能があります。 ES6でもES7でも同じことを実現したい。
このスニペットを持っている:
Object.assign({}, {key: 2}, {key: undefined})
{key: 2}
を受け取りたいです。現在、私は{key: undefined}
を受け取ります
これは[〜#〜]ではありません[〜#〜]ディープマージです。
出来ますか?はいの場合、それを達成する方法は?
Object.assign
を直接使用しても、これを実現することはできません。これは、次の各オブジェクトが前のマージで同じキーを書き換えるためです。手作りの機能で入ってくるオブジェクトをフィルタリングする唯一の方法。
function filterObject(obj) {
const ret = {};
Object.keys(obj)
.filter((key) => obj[key] !== undefined)
.forEach((key) => ret[key] = obj[key]);
return ret;
}
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
を作成するよりも好ましいようです。