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

Cha*_*had 13 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 }
Run Code Online (Sandbox Code Playgroud)

ssu*_*ube 25

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

var result = _.assign({}, l, m, n, o, p);
Run Code Online (Sandbox Code Playgroud)

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

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


Ada*_*uch 5

我喜欢defaults()这样的情况.

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

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

user;
// ? { user: 'barney', age: 36 }
Run Code Online (Sandbox Code Playgroud)

第一个参数是目标,并且user没有变异.我喜欢defaults()在需要覆盖属性时使用,就像这里的情况一样age,但不想实际更改原始内容中的任何内容.因为defaults()只会添加解析的属性undefined.该age属性存在于对象文字中,因此保留了它的值.

这种assign()方法同样适用 - defaults()只是一种不同的思考方式.


Mik*_*ank 5

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}
Run Code Online (Sandbox Code Playgroud)

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

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