immutability-util

JavaScript immutable data 模块
授权协议 MIT
开发语言 JavaScript
所属分类 Web应用开发、 常用JavaScript包
软件类型 开源软件
地区 国产
投 递 者 呼延原
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

immutability-util

一个关于 immutable data 处理的 JavaScript 模块,不修改原始值获得一份数据拷贝。使用 ES6 预发重写,并主要集中在性能以及更加好用的 API。

1. 特性

  1. 链式 API 调用,使用非常方便;

  2. 通过 path string 的方式寻找需要修改的节点,简化代码;

  3. 也许可以获得更好的性能;

2. 安装使用

使用 NPM 下载:

npm install -S immutability-util

然后使用方法如下:

const iu = require('immutability-util');
// or 
import iu from 'immutability-util';

// obj need to be mutated.
var obj = {
  a: 1,
  b: 2,
  c: {
    d: 3,
    e: {
      f: [4, 5, 6],
      g: {
        h: 'iu',
      },
    },
    i: {
      j: 'hello, world.',
      k: [7, 8, 9],
      l: [10, 11, 12],
    }
  },
};

// chainable usage.
const state = iu(state)
  .$apply(['a'], v => v + 1)
  .$merge(['c', 'e', 'g'], { m: 'update'})
  .$push(['c', 'e', 'f'], [7, 8, 9])
  .$set(['c', 'i', 'j'], 'hello node 8.')
  .$splice(['c', 'i', 'k'], [1, 1, 10])
  .$unset(['c'], ['d'])
  .$unshift(['c', 'i', 'l'], [13])
  .value(); // then get the mutated copy.
  
// or use path string.
iu(obj).$set('c.i.j', 'hello node 8.').value();

另外,也可以使用以下的方式处理数组路由;

const obj = {
  a: {
    b: [{
      c: [1, 2, 3],
    }, {
      d: 4,
    }, {
      e: [5, 6],
    }]
  }
};
const state = iu(obj)
  .$apply('a.b[1].d', v => v + 1)
  .$push('a.b[0].c', [4])
  .$set('a.b[2].e[0]', 'hello node 8.')
  .value();

3. 可用的 API

当获得了 ImmutabilityUtil 的实例后(引入模块就获得了),可以使用以下的方法:

  • $apply(path, function): 传入一个 function,并且把当前节点作为值传入;

  • $merge(path, object): 类似于数组的 merge 操作;

  • $push(path, array): 类似于数组的 push 操作;

  • $set(path, any): 直接替换对应位置的数据;

  • $splice(path, array_of_arrays): 类似于数组的 splice 方法;

  • $unset(path, array_of_strings): 删除键值;类似于 delete 方法;

  • $unshift(path, array): 类似于数组的 unshift 方法;

然后就可以使用 API value() 得到 immutable 数据拷贝。欢迎 pr 更多的操作方法;

4. Build & Test

通过下面的命令来 buikd 和测试:

npm run build
# run the testcases
npm run test

也可以运行 npm run benchmark 来查看性能对比。

5. License

MIT@hustcc.

  • 这节主要是讲 可变对象给编程带来的危害,所谓不可变对象,就是整个生命周期中不可变的对象(废话), e.g. : String 具体来说参见 Basic Java when we discussed snapshot diagrams Risks of mutation risk1:passing mutable values 看以下两段代码: /** @return the sum of the

  • 一、简单定义 不可变对象(Immutable Objects)即对象一旦被创建它的状态(对象的数据,也即对象属性值)就不能改变,反之即为可变对象(Mutable Objects)。   不可变对象的类即为不可变类(Immutable Class)。Java平台类库中包含许多不可变类,如String、基本类型的包装类等。 二、编写不可变类 可以遵照以下几点来编写一个不可变类:   确保类不能被继承

 相关资料
  • 在python中,字符串数据类型是不可变的。 这意味着无法更新字符串值。 我们可以通过尝试更新字符串的一部分来验证这一点,这将导致我们出错。 # Can not reassign t= "wenjiangs" print type(t) t[0] = "M" 当我们运行上面的程序时,我们得到以下输出 - <type> t[0] = "M" TypeError: 'str' object doe

  • 模块 模块是任何健壮的应用程序体系结构不可或缺的一部分,特点是有助于保持应用项目的代码单元既能清晰地分离又有组织。 在JavaScript中,实现模块有几个选项,他们包括: 模块化模式 对象表示法 AMD模块 CommonJS 模块 ECMAScript Harmony 模块 我们在书中后面的现代模块化JavaScript设计模式章节中将探讨这些选项中的最后三个。 模块化模式是基于对象的文字部分,

  • 问题内容: 在Github上查看CoffeeScript的源代码时,我注意到大多数(如果不是全部)模块定义如下: 这种模式看起来像是将整个模块包装在一个匿名函数中并调用自身。 这种方法的优点(和缺点)是什么?还有其他方法可以实现相同的目标吗? 问题答案: Harmen的答案是相当不错的,但让我详细说明一下CoffeeScript编译器在何处完成此操作以及原因。 当您使用编译内容时,总会得到如下所示

  • 每个模块都有一个名称,在模块中可以通过语句来找出模块的名称。这在一个场合特别有用——就如前面所提到的,当一个模块被第一次输入的时候,这个模块的主块将被运行。假如我们只想在程序本身被使用的时候运行主块,而在它被别的模块输入的时候不运行主块,我们该怎么做呢?这可以通过模块的__name__属性完成。 使用模块的__name__ 例8.2 使用模块的__name__ #!/usr/bin/python

  • 本文向大家介绍javascript设计模式之module(模块)模式,包括了javascript设计模式之module(模块)模式的使用技巧和注意事项,需要的朋友参考一下 模块是任何强大应用程序中不可或缺的一部分,它通常能帮助我们清晰地分离和组织项目中的代码单元。 js中实现模块的方法:  1.对象字面量表示法  2.Module模式  3.AMD模块  4.CommonJS模块  5.ECMAS

  • 问题内容: 我最近正在读《 学习JavaScript设计模式》 这本书。我没有得到的是模块模式和显示模块模式之间的区别。我觉得他们是同一回事。有人可以举一个例子吗? 问题答案: 至少有三种不同的方法来实现模块模式,但是显示模块模式是唯一具有正式名称的模块模式后代。 基本模块模式 模块模式必须满足以下条件: 私有成员住在封闭中。 公共成员暴露在返回对象中。 但是这个定义有很多歧义。通过以不同方式解决