nv-array-visitor

array,nest,visitor

Usage no npm install needed!

<script type="module">
  import nvArrayVisitor from 'https://cdn.skypack.dev/nv-array-visitor';
</script>

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