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

时间:2015-05-12 15:37:20

标签: javascript underscore.js lodash

在lodash,下划线或其他库中是否有一种替代方法几乎表现相同,除了它返回一个新对象而不是改变第一个参数?。

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

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

4 个答案:

答案 0 :(得分:23)

最常见的做法似乎是使用一个空对象并分配到它上面,如:

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

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

请记住,即使非常聪明的克隆实现也必须做同样的事情。手动创建新对象非常简单,因此大多数图书馆都不担心这种情况的帮手。下一个最接近的事情是_.create,这更多地与分配正确的原型有关。

答案 1 :(得分:5)

我喜欢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()只是另一种思考方式。

答案 2 :(得分:2)

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版本也是不变的)来递归合并嵌套对象。

答案 3 :(得分:1)

试用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' }