用ImmutableJS和&描述二叉树。自定义setIn函数

时间:2017-08-23 15:17:15

标签: javascript tree flux immutable.js

我试图根据Immutable-JS获得一个不可变的树结构。我看到的大多数人/例子正在使用Map或List不可变结构,但感觉就像作弊,而没有经典的Tree结构。我想知道什么是适应经典树以使其不可变的最佳方法。 如果你问为什么,我需要树是不可变的,以便fluxJS存储工作正常。不,改变通量lib不是一种可能的解决方案;)

所以这里是我为了描述树而编写的小班。

 export default class ParseTree {
        constructor ( ) {
            this.root = null
        }

        setIn( pathToNodeToModify, newValue ) {
            //Code here
        }
    }

export class Leaf {
    constructor( value ) {
        this.data = value;
        this.children = null;
    }
}

export class Node {
    constructor( isParallel, children = [] ) {
        this.data = Map( {
            id : createUniqueId(),
            isParallel : isParallel
        });
        this.children = children;
    }
}

问题1 - 您如何看待这种建造树木的方式?

正如你所看到的,我正在研究setIn函数,根据ImmutableJS Map有一个(参数:Node的路径,新值)。 我设法欺骗(至少我编码的感觉......我确实觉得很糟糕)并制作addToTree函数:

addToTree( process ) {
    let state = this.getState();
    var root = state.root;

    if ( !root ) {
        state = Object.create( ParseTree.prototype)
        state.root= new Leaf( process );
        return state;
    }

    let oldState = state;

    //Creating parseTree with the newNode
    var newNode = Object.create( ParseTree.prototype)
    newNode.root = Object.create( Leaf.prototype);
    newNode.root.data = process;
    newNode.root.children = null;

    // Creating new ParseTree composed of the oldParseTree and the newNode-ParseTree
    state = Object.create( ParseTree.prototype)
    state.root= Object.create( Node.prototype);
    state.root.data = Map( {isParallel : true, id : createUniqueId()});

    //For Later: will need to adapt To Position/location of Process
    state.root.children = [ oldState, newNode ];

    return state;
}

按照我在他们的Github上查看的Immutable-js代码,我试着找到一个函数来查找跟踪谓词后的特定节点的路径(我现在想要返回一个和一个唯一的节点,所以可能是一个谓词在ID上。)现在我决定返回一个id列表,但我也可以返回一个索引列表。

findPathTo ( tree,  predicate, keyPath = List() ) {
    const root = tree.root;

    if ( root != null ) {
        if ( this.isLeaf(root) ) {
            if ( predicate(root) ) {
                keyPath = keyPath.push(root.data.get('id'));
            }
        } else {
            keyPath = keyPath.push(root.data.get('id'));
            root.children.forEach( (oneChild) => {
                keyPath = this.findPathTo( oneChild , predicate, keyPath );
            });
        }
        return keyPath;
    }
    throw new TypeError( 'Invalid tree : your tree is empty. Try building some process.' )
}

问题2 - 使用findPathTo函数并从FluxJS设置newValue,我对如何实现setIn函数并使我的商店(树)的状态保持不变感到困惑。

0 个答案:

没有答案