来自 lodash 下划线或其他库的不可变 _.assign(使用克隆分配)?

Immutable _.assign (assign with clone) from lodash underscore or other library?

在 lodash、underscore 或其他库中是否有可用的替代方法,其行为方式几乎相同,只是 returns 一个新对象而不是改变第一个参数?

var o = { 'user': 'barney' }
var result = method(o, { 'age': 40 }, { 'user': 'fred' })

// o still { 'user': 'barney' }
// result is now { 'user': 'fred', 'age': 40 }

最常见的做法似乎是使用一个空对象并对其进行赋值,例如:

var result = _.assign({}, l, m, n, o, p);

这在技术上不是不可变的,但会产生一个 "new" 在函数被调用之前不存在的对象。

请记住,即使是非常聪明的克隆实现也必须做同样的事情。手动创建新对象是微不足道的,因此大多数库不担心这种情况下的帮助程序。下一个最接近的是 _.create,它与分配正确的原型有更多关系。

试用immutable-js

var result = Immutable.Map(o).merge({ age: 40, user: 'fred' }).toObject();
console.log(result); // { user: 'fred', age: 40 }
console.log(o); // { user: 'barney' }

我喜欢 defaults() 这种情况。

var user = { user: 'barney', age: 36 };

_.defaults({ age: 40 }, user);
// → { user: 'barney', age: 40 }

user;
// → { user: 'barney', age: 36 }

第一个参数是目的地,user 没有变化。当我需要覆盖属性时,我喜欢使用 defaults(),就像 age 的情况一样,但不想实际更改原始文件中的任何内容。因为 defaults() 只会添加解析为 undefined 的属性。 age 属性 存在于对象字面量中,所以它的值被保留。

assign() 方法同样有效 - defaults() 只是一种不同的思考方式。

lodash 的函数式编程变体 assign 不会改变任何参数 :)

试试这个:

import { assign } from 'lodash/fp';
// or:
// import _ from 'lodash/fp';

const a = {a: 1};
const b = {b: 1};
const c = assign(a, b);

// Results after assign operation:
// a: {a: 1}
// b: {b: 1}
// c: {a: 1, b: 1}

https://github.com/lodash/lodash/wiki/FP-Guide

使用mergemerge 的 FP 版本也是不可变的)递归合并嵌套对象。