Home Manual Reference Source Repository

Function

Static Public Summary
public

createDiffNode(changeType: string, oldValue: *, newValue: *): Object

创建一个差异节点

public

defaults(source: Object, path: string? | Array<string>, value: *): Object

针对$defaults指令的快捷函数

public

invoke(source: Object, path: string? | Array<string>, factory: Function): Object

针对$invoke指令的快捷函数

public

isDiffNode(node: *): boolean

判断一个对象是否为差异节点

public

merge(source: Object, path: string? | Array<string>, value: *): Object

针对$merge指令的快捷函数

public

mergeDiff(stored: Object, merging: Object, oldValue: *, newValue: *): Object

合并差异对象

public

合并2个差异节点

public

push(source: Object, path: string? | Array<string>, value: *): Object

针对$push指令的快捷函数

public

set(source: Object, path: string? | Array<string>, value: *): Object

针对$set指令的快捷函数

public

unshift(source: Object, path: string? | Array<string>, value: *): Object

针对$unshift指令的快捷函数

public

update(source: Object, commands: Object): Object

效果等同于withDiff函数,但不返回差异对象

public

withDiff(source: Object, commands: Object): Array

根据提供的指令更新一个对象,返回更新后的新对象以及新旧对象的差异(diff),原对象不会作任何的修改

Static Public

public createDiffNode(changeType: string, oldValue: *, newValue: *): Object source

import {createDiffNode} from 'diffy-update/src/diffNode.js'

创建一个差异节点

通常此函数由withDiffmergeDiff等函数调用得到差异节点,大部分场景下开发者并不需要自行创建差异节点

本函数依赖外部参数正确,并不会对参数间的关系进行检测,需要在调用时保证如changeType"add"时,oldValueundefined等约束

Params:

NameTypeAttributeDescription
changeType string

变化的各类,可以为"add""remove""change"

oldValue *

原值

newValue *

新值

Return:

Object

一个差异节点

public defaults(source: Object, path: string? | Array<string>, value: *): Object source

import {defaults} from 'diffy-update'

针对$defaults指令的快捷函数

Params:

NameTypeAttributeDescription
source Object

待更新的对象

path string? | Array<string>

属性的路径,如果更新二层以上的属性则需要提供一个字符串数组, 如果该参数为undefinednull,则会直接对source对象进行更新操作

value *

用于更新的值

Return:

Object

更新后的新对象

public invoke(source: Object, path: string? | Array<string>, factory: Function): Object source

import {invoke} from 'diffy-update'

针对$invoke指令的快捷函数

Params:

NameTypeAttributeDescription
source Object

待更新的对象

path string? | Array<string>

属性的路径,如果更新二层以上的属性则需要提供一个字符串数组, 如果该参数为undefinednull,则会直接对source对象进行更新操作

factory Function

用于生成新值的工厂函数

Return:

Object

更新后的新对象

public isDiffNode(node: *): boolean source

import {isDiffNode} from 'diffy-update/src/diffNode.js'

判断一个对象是否为差异节点

如果一个对象为差异节点,那么它有且仅有以下属性:

  • changeType表示修改的类型,值为"add""remove"或者"change"
  • oldValue表示修改前的值,如果changeType"add"则值恒定为undefined
  • newValue表示修改后的值,如果changeType"remove"则值恒定为undefined

Params:

NameTypeAttributeDescription
node *

用于判断的节点

Return:

boolean

public merge(source: Object, path: string? | Array<string>, value: *): Object source

import {merge} from 'diffy-update'

针对$merge指令的快捷函数

Params:

NameTypeAttributeDescription
source Object

待更新的对象

path string? | Array<string>

属性的路径,如果更新二层以上的属性则需要提供一个字符串数组, 如果该参数为undefinednull,则会直接对source对象进行更新操作

value *

用于更新的值

Return:

Object

更新后的新对象

public mergeDiff(stored: Object, merging: Object, oldValue: *, newValue: *): Object source

import {mergeDiff} from 'diffy-update/src/merge.js'

合并差异对象

这个函数用来将多次更新的差异对象合并,但需要最初的与最后更新后的对象值

Params:

NameTypeAttributeDescription
stored Object

已经存在的差异对象

merging Object

需要合并的差异对象

oldValue *

更新前的对象的值

newValue *

更新后的对象的值

Return:

Object

合并后的差异对象

public mergeDiffNode(x: Object, y: Object): Object source

import {mergeDiffNode} from 'diffy-update/src/merge.js'

合并2个差异节点

Params:

NameTypeAttributeDescription
x Object

差异节点

y Object

差异节点

Return:

Object

合并后的差异节点,可能为null表示合并以后没有差异

public push(source: Object, path: string? | Array<string>, value: *): Object source

import {push} from 'diffy-update'

针对$push指令的快捷函数

Params:

NameTypeAttributeDescription
source Object

待更新的对象

path string? | Array<string>

属性的路径,如果更新二层以上的属性则需要提供一个字符串数组, 如果该参数为undefinednull,则会直接对source对象进行更新操作

value *

用于更新的值

Return:

Object

更新后的新对象

public set(source: Object, path: string? | Array<string>, value: *): Object source

import {set} from 'diffy-update'

针对$set指令的快捷函数

Params:

NameTypeAttributeDescription
source Object

待更新的对象

path string? | Array<string>

属性的路径,如果更新二层以上的属性则需要提供一个字符串数组, 如果该参数为undefinednull,则会直接对source对象进行更新操作

value *

用于更新的值

Return:

Object

更新后的新对象

public unshift(source: Object, path: string? | Array<string>, value: *): Object source

import {unshift} from 'diffy-update'

针对$unshift指令的快捷函数

Params:

NameTypeAttributeDescription
source Object

待更新的对象

path string? | Array<string>

属性的路径,如果更新二层以上的属性则需要提供一个字符串数组, 如果该参数为undefinednull,则会直接对source对象进行更新操作

value *

用于更新的值

Return:

Object

更新后的新对象

public update(source: Object, commands: Object): Object source

import update from 'diffy-update'

效果等同于withDiff函数,但不返回差异对象

Params:

NameTypeAttributeDescription
source Object

待更新的对象

commands Object

用于更新的指令

Return:

Object

更新后的新对象

public withDiff(source: Object, commands: Object): Array source

import {withDiff} from 'diffy-update'

根据提供的指令更新一个对象,返回更新后的新对象以及新旧对象的差异(diff),原对象不会作任何的修改

现有支持的指令包括:

  • $set:修改指定的属性值
  • $push:向类型为数组的属性尾部添加元素
  • $unshift:向类型为数组的属性头部添加元素
  • $merge:将2个对象进行浅合并(不递归)
  • $defaults:将指定对象的属性值填到原属性为undefined的属性上
  • $invoke:用一个工厂函数的返回值作为$set指令的输入,工厂函数接受属性的旧值作为唯一的参数

可以在一次更新操作中对不同的属性用不同的指令:

import {withDiff} from 'diffy-update';

let [newObject, diff] = withDiff(
    source,
    {
        foo: {bar: {$set: 1}},
        alice: {$push: 1},
        tom: {jack: {$set: {x: 1}}
    }
);

该函数返回一个数组,其中第二个元素为对象更新前后的差异,一个差异对象大致有以下结构:

{
    foo: {
        bar: {
            changeType: 'add' // can be "add", "change" or "remove",
            oldValue: [1, 2, 3],
            newValue: [2, 3, 4]
        }
    }
}

我们可以对差异对象进行简单的遍历,其中通过isDiffNode函数判断的节点即为差异节点,因此我们可以找到对象更新前后的最小差异

需注意的是当前版本并未实现数组类型的差异描述

Params:

NameTypeAttributeDescription
source Object

待更新的对象

commands Object

用于更新的指令

Return:

Array

函数返回一个数组,结构为[newObject, diff],其中 newObject为更新后的对象,diff为更新前后的差异, diff is a diff object between the original object and the modified one.