来自 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
,它与分配正确的原型有更多关系。
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
使用merge
(merge
的 FP 版本也是不可变的)递归合并嵌套对象。
在 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
,它与分配正确的原型有更多关系。
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
使用merge
(merge
的 FP 版本也是不可变的)递归合并嵌套对象。