我试图根据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函数并使我的商店(树)的状态保持不变感到困惑。