README
nv-array-visitor
- nv-array-visitor
install
- npm install nv-array-visitor
usage
const ary_visit = require("nv-array-visitor")
example
visit
replace,insert
var ary = [ 1, 2, [ 3, 4 ], 5, [ 6, [ 7 ], 8 ] ]
ary_visit.visit(
ary,
(v,i,visitor,self)=> {
if(self.is_leaf()) {
if(typeof(v)==='number'){
if(v%2) {
visitor.replace_after_leave(v+':odd')
} else {
visitor.replace_after_leave(v+':even')
}
} else {
}
} else {
if(self.state===ary_visit.STATE_DICT.before_enter) {
visitor.insert_before("<");
} else {
visitor.insert_after(">");
}
}
}
);
>ary
[
'1:odd',
'2:even',
'<',
[ '3:odd', '4:even' ],
'>',
'5:odd',
'<',
[ '6:even', '<', [ '7:odd' ], '>', '8:even' ],
'>'
]
remove
var ary = [ 1, 2, [ 3, 4 ], 5, [ 6, [ 7 ], 8 ] ]
ary_visit.visit(
ary,
(v,i,visitor,self)=> {
if(self.is_leaf()) {
if(typeof(v)==='number'){
if(v%2) {
visitor.replace_after_leave(v+':odd')
} else {
visitor.replace_after_leave(v+':even')
}
} else {
}
} else {
visitor.remove_after_leave()
}
}
);
>ary
[ '1:odd', '2:even', '5:odd' ]
self
var ary = [ 1, 2, [ 3, 4 ], 5, [ 6, [ 7 ], 8 ] ]
ary_visit.visit(
ary,
(v,i,visitor,self)=> {
console.log(v,self.depth_,self.pl_)
}
);
/*
1 1 [ 0 ]
1 1 [ 0 ]
2 1 [ 1 ]
2 1 [ 1 ]
[ 3, 4 ] 1 [ 2 ]
3 2 [ 2, 0 ]
3 2 [ 2, 0 ]
4 2 [ 2, 1 ]
4 2 [ 2, 1 ]
[ 3, 4 ] 1 [ 2 ]
5 1 [ 3 ]
5 1 [ 3 ]
[ 6, [ 7 ], 8 ] 1 [ 4 ]
6 2 [ 4, 0 ]
6 2 [ 4, 0 ]
[ 7 ] 2 [ 4, 1 ]
7 3 [ 4, 1, 0 ]
7 3 [ 4, 1, 0 ]
[ 7 ] 2 [ 4, 1 ]
8 2 [ 4, 2 ]
8 2 [ 4, 2 ]
[ 6, [ 7 ], 8 ] 1 [ 4 ]
*/
SELF
SELF_DICT: {
is_leaf: 'is leaf',
is_lst: 'is last element',
pl_: 'index path list',
depth_: 'which layer',
state: 'open<before_enter> or close<after_leave>'
},
ACTION
ACTION_DICT: {
skip: 'visitor.skip()',
insert_before: 'visitor.insert_before(val)',
insert_after: 'visitor.insert_after(val)',
remove_before_enter: 'visitor.remove_before_enter(),will NOT visit the decendants',
remove_after_leave: 'visitor.remove_after_leave(),will be removed after visiting the decendants',
replace_before_enter: '\n' +
'visitor.replace_before_enter(new_value),\n' +
'will NOT visit the old_val,\n' +
'will visit the new_value',
replace_after_leave: '\n' +
'visitor.replace_after_leave(new_value),\n' +
'will visit the old_val,\n' +
'will NOT visit the new_value'
}
STATE
STATE_DICT: { before_enter: 'open', after_leave: 'close' }
flat
> var ary = [ 1, 2, [ 3, 4 ], 5, [ 6, [ 7 ], 8 ] ]
> ary_visit.flat(ary)
[
1, 2, 3, 4,
5, 6, 7, 8
]
>
dcp
> var ary = [ 1, 2, [ 3, 4 ], 5, [ 6, [ 7 ], 8 ] ]
> var cloned = ary_visit.dcp(ary)
> cloned
[ 1, 2, [ 3, 4 ], 5, [ 6, [ 7 ], 8 ] ]
> cloned[2]
[ 3, 4 ]
> ary[2]
[ 3, 4 ]
> cloned[2] !== ary[2]
true
>
indexify
> var ary = [ 1, 2, [ 3, 4 ], 5, [ 6, [ 7 ], 8 ] ]
> ary_visit.indexify(ary)
[
{ ___index: 0, ___value: 1 },
{ ___index: 1, ___value: 2 },
[ { ___index: 0, ___value: 3 }, { ___index: 1, ___value: 4 } ],
{ ___index: 3, ___value: 5 },
[
{ ___index: 0, ___value: 6 },
[ [Object] ],
{ ___index: 2, ___value: 8 }
]
]
> ary
[
{ ___index: 0, ___value: 1 },
{ ___index: 1, ___value: 2 },
[ { ___index: 0, ___value: 3 }, { ___index: 1, ___value: 4 } ],
{ ___index: 3, ___value: 5 },
[
{ ___index: 0, ___value: 6 },
[ [Object] ],
{ ___index: 2, ___value: 8 }
]
]
>
API
visit(array,(v,i,visitor,self)=> {/.../})
dfs_gen(array)
sedfs_gen(array)
visitor_gen(array,(v,i,visitor,self)=>{/..../})
is_leaf(array)
pl_get(array,index_path_list)
flat(array)
get_non_leafs(array)
dcp(array)
indexcify(array,idx_key="___index",val_key="___value")
RESTRICT
- all element NOT array will be treated as leaf
LICENSE
- ISC