Zhenfei.Li-李振飞
2 years ago
15 changed files with 3252 additions and 3257 deletions
@ -1,63 +1,58 @@
|
||||
!(function () { |
||||
function aspect (type) { |
||||
return function (target, methodName, advice) { |
||||
var exist = target[methodName], |
||||
dispatcher; |
||||
|
||||
if (!exist || exist.target != target) { |
||||
dispatcher = target[methodName] = function () { |
||||
// before methods
|
||||
var beforeArr = dispatcher.before; |
||||
var args = arguments, next; |
||||
for (var l = beforeArr.length; l--;) { |
||||
next = beforeArr[l].advice.apply(this, args); |
||||
if (next === false) { |
||||
return false; |
||||
} |
||||
args = next || args; |
||||
} |
||||
// target method
|
||||
var rs = dispatcher.method.apply(this, args); |
||||
// after methods
|
||||
var afterArr = dispatcher.after; |
||||
for (var i = 0, ii = afterArr.length; i < ii; i++) { |
||||
next = afterArr[i].advice.call(this, rs, args); |
||||
if (rs === false) { |
||||
return false; |
||||
} |
||||
args = next || args; |
||||
function _aspect(type) { |
||||
return function (target, methodName, advice) { |
||||
let exist = target[methodName], |
||||
dispatcher; |
||||
|
||||
if (!exist || exist.target != target) { |
||||
dispatcher = target[methodName] = function () { |
||||
// before methods
|
||||
let beforeArr = dispatcher.before; |
||||
let args = arguments, next; |
||||
for (let l = beforeArr.length; l--;) { |
||||
next = beforeArr[l].advice.apply(this, args); |
||||
if (next === false) { |
||||
return false; |
||||
} |
||||
return rs; |
||||
}; |
||||
|
||||
dispatcher.before = []; |
||||
dispatcher.after = []; |
||||
|
||||
if (exist) { |
||||
dispatcher.method = exist; |
||||
args = next || args; |
||||
} |
||||
dispatcher.target = target; |
||||
} |
||||
|
||||
var aspectArr = (dispatcher || exist)[type]; |
||||
var obj = { |
||||
advice: advice, |
||||
_index: aspectArr.length, |
||||
remove: function () { |
||||
aspectArr.splice(this._index, 1); |
||||
// target method
|
||||
let rs = dispatcher.method.apply(this, args); |
||||
// after methods
|
||||
let afterArr = dispatcher.after; |
||||
for (let i = 0, ii = afterArr.length; i < ii; i++) { |
||||
next = afterArr[i].advice.call(this, rs, args); |
||||
if (rs === false) { |
||||
return false; |
||||
} |
||||
args = next || args; |
||||
} |
||||
return rs; |
||||
}; |
||||
aspectArr.push(obj); |
||||
|
||||
return obj; |
||||
dispatcher.before = []; |
||||
dispatcher.after = []; |
||||
|
||||
if (exist) { |
||||
dispatcher.method = exist; |
||||
} |
||||
dispatcher.target = target; |
||||
} |
||||
|
||||
let aspectArr = (dispatcher || exist)[type]; |
||||
let obj = { |
||||
advice: advice, |
||||
_index: aspectArr.length, |
||||
remove: function () { |
||||
aspectArr.splice(this._index, 1); |
||||
}, |
||||
}; |
||||
} |
||||
aspectArr.push(obj); |
||||
|
||||
BI.aspect = { |
||||
before: aspect("before"), |
||||
after: aspect("after") |
||||
return obj; |
||||
}; |
||||
} |
||||
|
||||
return BI.aspect; |
||||
|
||||
})(); |
||||
export const aspect = { |
||||
before: _aspect("before"), |
||||
after: _aspect("after"), |
||||
}; |
||||
|
@ -1,130 +1,132 @@
|
||||
const _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; |
||||
|
||||
!(function () { |
||||
|
||||
var _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; |
||||
// private method for UTF-8 encoding
|
||||
const _utf8_encode = function (string) { |
||||
string = string.replace(/\r\n/g, "\n"); |
||||
let utftext = ""; |
||||
|
||||
for (let n = 0; n < string.length; n++) { |
||||
|
||||
// private method for UTF-8 encoding
|
||||
var _utf8_encode = function (string) { |
||||
string = string.replace(/\r\n/g, "\n"); |
||||
var utftext = ""; |
||||
|
||||
for (var n = 0; n < string.length; n++) { |
||||
|
||||
var c = string.charCodeAt(n); |
||||
|
||||
if (c < 128) { |
||||
utftext += String.fromCharCode(c); |
||||
} else if ((c > 127) && (c < 2048)) { |
||||
utftext += String.fromCharCode((c >> 6) | 192); |
||||
utftext += String.fromCharCode((c & 63) | 128); |
||||
} else { |
||||
utftext += String.fromCharCode((c >> 12) | 224); |
||||
utftext += String.fromCharCode(((c >> 6) & 63) | 128); |
||||
utftext += String.fromCharCode((c & 63) | 128); |
||||
} |
||||
const c = string.charCodeAt(n); |
||||
|
||||
if (c < 128) { |
||||
utftext += String.fromCharCode(c); |
||||
} else if ((c > 127) && (c < 2048)) { |
||||
utftext += String.fromCharCode((c >> 6) | 192); |
||||
utftext += String.fromCharCode((c & 63) | 128); |
||||
} else { |
||||
utftext += String.fromCharCode((c >> 12) | 224); |
||||
utftext += String.fromCharCode(((c >> 6) & 63) | 128); |
||||
utftext += String.fromCharCode((c & 63) | 128); |
||||
} |
||||
|
||||
return utftext; |
||||
}; |
||||
|
||||
// private method for UTF-8 decoding
|
||||
var _utf8_decode = function (utftext) { |
||||
var string = ""; |
||||
var i = 0; |
||||
var c = 0, c3 = 0, c2 = 0; |
||||
|
||||
while (i < utftext.length) { |
||||
|
||||
c = utftext.charCodeAt(i); |
||||
|
||||
if (c < 128) { |
||||
string += String.fromCharCode(c); |
||||
i++; |
||||
} else if ((c > 191) && (c < 224)) { |
||||
c2 = utftext.charCodeAt(i + 1); |
||||
string += String.fromCharCode(((c & 31) << 6) | (c2 & 63)); |
||||
i += 2; |
||||
} else { |
||||
c2 = utftext.charCodeAt(i + 1); |
||||
c3 = utftext.charCodeAt(i + 2); |
||||
string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); |
||||
i += 3; |
||||
} |
||||
|
||||
} |
||||
|
||||
return utftext; |
||||
}; |
||||
|
||||
// private method for UTF-8 decoding
|
||||
const _utf8_decode = function (utftext) { |
||||
let string = ""; |
||||
let i = 0; |
||||
let c = 0, c3 = 0, c2 = 0; |
||||
|
||||
while (i < utftext.length) { |
||||
|
||||
c = utftext.charCodeAt(i); |
||||
|
||||
if (c < 128) { |
||||
string += String.fromCharCode(c); |
||||
i++; |
||||
} else if ((c > 191) && (c < 224)) { |
||||
c2 = utftext.charCodeAt(i + 1); |
||||
string += String.fromCharCode(((c & 31) << 6) | (c2 & 63)); |
||||
i += 2; |
||||
} else { |
||||
c2 = utftext.charCodeAt(i + 1); |
||||
c3 = utftext.charCodeAt(i + 2); |
||||
string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); |
||||
i += 3; |
||||
} |
||||
return string; |
||||
}; |
||||
|
||||
BI._.extend(BI, { |
||||
|
||||
encode: function (input) { |
||||
var output = ""; |
||||
var chr1, chr2, chr3, enc1, enc2, enc3, enc4; |
||||
var i = 0; |
||||
|
||||
input = _utf8_encode(input); |
||||
|
||||
while (i < input.length) { |
||||
|
||||
chr1 = input.charCodeAt(i++); |
||||
chr2 = input.charCodeAt(i++); |
||||
chr3 = input.charCodeAt(i++); |
||||
|
||||
enc1 = chr1 >> 2; |
||||
enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); |
||||
enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); |
||||
enc4 = chr3 & 63; |
||||
|
||||
if (isNaN(chr2)) { |
||||
enc3 = enc4 = 64; |
||||
} else if (isNaN(chr3)) { |
||||
enc4 = 64; |
||||
} |
||||
} |
||||
return string; |
||||
}; |
||||
|
||||
/** |
||||
* base64 encode |
||||
* @param input |
||||
* @returns {string} |
||||
*/ |
||||
export function encode(input) { |
||||
let output = ""; |
||||
let chr1, chr2, chr3, enc1, enc2, enc3, enc4; |
||||
let i = 0; |
||||
|
||||
input = _utf8_encode(input); |
||||
|
||||
while (i < input.length) { |
||||
|
||||
chr1 = input.charCodeAt(i++); |
||||
chr2 = input.charCodeAt(i++); |
||||
chr3 = input.charCodeAt(i++); |
||||
|
||||
enc1 = chr1 >> 2; |
||||
enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); |
||||
enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); |
||||
enc4 = chr3 & 63; |
||||
|
||||
if (isNaN(chr2)) { |
||||
enc3 = enc4 = 64; |
||||
} else if (isNaN(chr3)) { |
||||
enc4 = 64; |
||||
} |
||||
|
||||
output = output + _keyStr.charAt(enc1) + _keyStr.charAt(enc2) + _keyStr.charAt(enc3) + _keyStr.charAt(enc4); |
||||
output = output + _keyStr.charAt(enc1) + _keyStr.charAt(enc2) + _keyStr.charAt(enc3) + _keyStr.charAt(enc4); |
||||
|
||||
} |
||||
} |
||||
|
||||
return output; |
||||
}, |
||||
return output; |
||||
} |
||||
|
||||
// public method for decoding
|
||||
decode: function (input) { |
||||
var output = ""; |
||||
var chr1, chr2, chr3; |
||||
var enc1, enc2, enc3, enc4; |
||||
var i = 0; |
||||
/** |
||||
* base64 decode |
||||
* @param input |
||||
* @returns {string} |
||||
*/ |
||||
export function decode(input) { |
||||
let output = ""; |
||||
let chr1, chr2, chr3; |
||||
let enc1, enc2, enc3, enc4; |
||||
let i = 0; |
||||
|
||||
input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ""); |
||||
input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ""); |
||||
|
||||
while (i < input.length) { |
||||
while (i < input.length) { |
||||
|
||||
enc1 = _keyStr.indexOf(input.charAt(i++)); |
||||
enc2 = _keyStr.indexOf(input.charAt(i++)); |
||||
enc3 = _keyStr.indexOf(input.charAt(i++)); |
||||
enc4 = _keyStr.indexOf(input.charAt(i++)); |
||||
enc1 = _keyStr.indexOf(input.charAt(i++)); |
||||
enc2 = _keyStr.indexOf(input.charAt(i++)); |
||||
enc3 = _keyStr.indexOf(input.charAt(i++)); |
||||
enc4 = _keyStr.indexOf(input.charAt(i++)); |
||||
|
||||
chr1 = (enc1 << 2) | (enc2 >> 4); |
||||
chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); |
||||
chr3 = ((enc3 & 3) << 6) | enc4; |
||||
chr1 = (enc1 << 2) | (enc2 >> 4); |
||||
chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); |
||||
chr3 = ((enc3 & 3) << 6) | enc4; |
||||
|
||||
output = output + String.fromCharCode(chr1); |
||||
output = output + String.fromCharCode(chr1); |
||||
|
||||
if (enc3 != 64) { |
||||
output = output + String.fromCharCode(chr2); |
||||
} |
||||
if (enc4 != 64) { |
||||
output = output + String.fromCharCode(chr3); |
||||
} |
||||
if (enc3 != 64) { |
||||
output = output + String.fromCharCode(chr2); |
||||
} |
||||
if (enc4 != 64) { |
||||
output = output + String.fromCharCode(chr3); |
||||
} |
||||
|
||||
} |
||||
} |
||||
|
||||
output = _utf8_decode(output); |
||||
output = _utf8_decode(output); |
||||
|
||||
return output; |
||||
return output; |
||||
|
||||
} |
||||
}); |
||||
})(); |
||||
} |
||||
|
@ -1,115 +1,111 @@
|
||||
function defaultComparator(a, b) { |
||||
return a < b; |
||||
} |
||||
|
||||
(function () { |
||||
function defaultComparator (a, b) { |
||||
return a < b; |
||||
} |
||||
|
||||
BI.Heap = function (items, comparator) { |
||||
export class Heap { |
||||
constructor(items, comparator) { |
||||
this._items = items || []; |
||||
this._size = this._items.length; |
||||
this._comparator = comparator || defaultComparator; |
||||
this._heapify(); |
||||
}; |
||||
|
||||
BI.Heap.prototype = { |
||||
constructor: BI.Heap, |
||||
empty: function () { |
||||
return this._size === 0; |
||||
}, |
||||
} |
||||
|
||||
pop: function () { |
||||
if (this._size === 0) { |
||||
return; |
||||
} |
||||
empty() { |
||||
return this._size === 0; |
||||
} |
||||
|
||||
var elt = this._items[0]; |
||||
pop() { |
||||
if (this._size === 0) { |
||||
return; |
||||
} |
||||
|
||||
var lastElt = this._items.pop(); |
||||
this._size--; |
||||
const elt = this._items[0]; |
||||
|
||||
if (this._size > 0) { |
||||
this._items[0] = lastElt; |
||||
this._sinkDown(0); |
||||
} |
||||
const lastElt = this._items.pop(); |
||||
this._size--; |
||||
|
||||
return elt; |
||||
}, |
||||
if (this._size > 0) { |
||||
this._items[0] = lastElt; |
||||
this._sinkDown(0); |
||||
} |
||||
|
||||
push: function (item) { |
||||
this._items[this._size++] = item; |
||||
this._bubbleUp(this._size - 1); |
||||
}, |
||||
return elt; |
||||
} |
||||
|
||||
size: function () { |
||||
return this._size; |
||||
}, |
||||
push(item) { |
||||
this._items[this._size++] = item; |
||||
this._bubbleUp(this._size - 1); |
||||
} |
||||
|
||||
peek: function () { |
||||
if (this._size === 0) { |
||||
return; |
||||
} |
||||
size() { |
||||
return this._size; |
||||
} |
||||
|
||||
return this._items[0]; |
||||
}, |
||||
peek() { |
||||
if (this._size === 0) { |
||||
return; |
||||
} |
||||
|
||||
_heapify: function () { |
||||
for (var index = Math.floor((this._size + 1) / 2); index >= 0; index--) { |
||||
this._sinkDown(index); |
||||
} |
||||
}, |
||||
return this._items[0]; |
||||
} |
||||
|
||||
_bubbleUp: function (index) { |
||||
var elt = this._items[index]; |
||||
while (index > 0) { |
||||
var parentIndex = Math.floor((index + 1) / 2) - 1; |
||||
var parentElt = this._items[parentIndex]; |
||||
_heapify() { |
||||
for (let index = Math.floor((this._size + 1) / 2); index >= 0; index--) { |
||||
this._sinkDown(index); |
||||
} |
||||
} |
||||
|
||||
// if parentElt < elt, stop
|
||||
if (this._comparator(parentElt, elt)) { |
||||
return; |
||||
} |
||||
_bubbleUp(index) { |
||||
const elt = this._items[index]; |
||||
while (index > 0) { |
||||
const parentIndex = Math.floor((index + 1) / 2) - 1; |
||||
const parentElt = this._items[parentIndex]; |
||||
|
||||
// swap
|
||||
this._items[parentIndex] = elt; |
||||
this._items[index] = parentElt; |
||||
index = parentIndex; |
||||
// if parentElt < elt, stop
|
||||
if (this._comparator(parentElt, elt)) { |
||||
return; |
||||
} |
||||
}, |
||||
|
||||
_sinkDown: function (index) { |
||||
var elt = this._items[index]; |
||||
// swap
|
||||
this._items[parentIndex] = elt; |
||||
this._items[index] = parentElt; |
||||
index = parentIndex; |
||||
} |
||||
} |
||||
|
||||
while (true) { |
||||
var leftChildIndex = 2 * (index + 1) - 1; |
||||
var rightChildIndex = 2 * (index + 1); |
||||
var swapIndex = -1; |
||||
_sinkDown(index) { |
||||
const elt = this._items[index]; |
||||
|
||||
if (leftChildIndex < this._size) { |
||||
var leftChild = this._items[leftChildIndex]; |
||||
if (this._comparator(leftChild, elt)) { |
||||
swapIndex = leftChildIndex; |
||||
} |
||||
} |
||||
while (true) { |
||||
const leftChildIndex = 2 * (index + 1) - 1; |
||||
const rightChildIndex = 2 * (index + 1); |
||||
let swapIndex = -1; |
||||
|
||||
if (rightChildIndex < this._size) { |
||||
var rightChild = this._items[rightChildIndex]; |
||||
if (this._comparator(rightChild, elt)) { |
||||
if (swapIndex === -1 || |
||||
this._comparator(rightChild, this._items[swapIndex])) { |
||||
swapIndex = rightChildIndex; |
||||
} |
||||
} |
||||
if (leftChildIndex < this._size) { |
||||
const leftChild = this._items[leftChildIndex]; |
||||
if (this._comparator(leftChild, elt)) { |
||||
swapIndex = leftChildIndex; |
||||
} |
||||
} |
||||
|
||||
// if we don't have a swap, stop
|
||||
if (swapIndex === -1) { |
||||
return; |
||||
if (rightChildIndex < this._size) { |
||||
const rightChild = this._items[rightChildIndex]; |
||||
if (this._comparator(rightChild, elt)) { |
||||
if (swapIndex === -1 || |
||||
this._comparator(rightChild, this._items[swapIndex])) { |
||||
swapIndex = rightChildIndex; |
||||
} |
||||
} |
||||
} |
||||
|
||||
this._items[index] = this._items[swapIndex]; |
||||
this._items[swapIndex] = elt; |
||||
index = swapIndex; |
||||
// if we don't have a swap, stop
|
||||
if (swapIndex === -1) { |
||||
return; |
||||
} |
||||
|
||||
this._items[index] = this._items[swapIndex]; |
||||
this._items[swapIndex] = elt; |
||||
index = swapIndex; |
||||
} |
||||
}; |
||||
})(); |
||||
} |
||||
} |
||||
|
@ -0,0 +1,13 @@
|
||||
export * from "./aes"; |
||||
export * from "./aspect"; |
||||
export * from "./base64"; |
||||
export * from "./cache"; |
||||
export * from "./cellSizeAndPositionManager"; |
||||
export * from "./heap"; |
||||
export * from "./linkedHashMap"; |
||||
export * from "./lru"; |
||||
export * from "./prefixIntervalTree"; |
||||
export * from "./queue"; |
||||
export * from "./sectionManager"; |
||||
export * from "./tree"; |
||||
export * from "./vector"; |
@ -1,72 +1,66 @@
|
||||
|
||||
!(function () { |
||||
BI.LinkHashMap = function () { |
||||
export class LinkHashMap { |
||||
constructor() { |
||||
this.array = []; |
||||
this.map = {}; |
||||
}; |
||||
BI.LinkHashMap.prototype = { |
||||
constructor: BI.LinkHashMap, |
||||
has: function (key) { |
||||
if (key in this.map) { |
||||
return true; |
||||
} |
||||
return false; |
||||
}, |
||||
|
||||
add: function (key, value) { |
||||
if (typeof key === "undefined") { |
||||
return; |
||||
} |
||||
if (key in this.map) { |
||||
this.map[key] = value; |
||||
} else { |
||||
this.array.push(key); |
||||
this.map[key] = value; |
||||
} |
||||
}, |
||||
} |
||||
|
||||
remove: function (key) { |
||||
if (key in this.map) { |
||||
delete this.map[key]; |
||||
for (var i = 0; i < this.array.length; i++) { |
||||
if (this.array[i] == key) { |
||||
this.array.splice(i, 1); |
||||
break; |
||||
} |
||||
} |
||||
} |
||||
}, |
||||
has(key) { |
||||
return key in this.map; |
||||
} |
||||
|
||||
size: function () { |
||||
return this.array.length; |
||||
}, |
||||
add(key, value) { |
||||
if (typeof key === "undefined") { |
||||
return; |
||||
} |
||||
if (key in this.map) { |
||||
this.map[key] = value; |
||||
} else { |
||||
this.array.push(key); |
||||
this.map[key] = value; |
||||
} |
||||
} |
||||
|
||||
each: function (fn, scope) { |
||||
var scope = scope || window; |
||||
var fn = fn || null; |
||||
if (fn == null || typeof (fn) !== "function") { |
||||
return; |
||||
} |
||||
for (var i = 0; i < this.array.length; i++) { |
||||
var key = this.array[i]; |
||||
var value = this.map[key]; |
||||
var re = fn.call(scope, key, value, i, this.array, this.map); |
||||
if (re == false) { |
||||
remove(key) { |
||||
if (key in this.map) { |
||||
delete this.map[key]; |
||||
for (let i = 0; i < this.array.length; i++) { |
||||
if (this.array[i] == key) { |
||||
this.array.splice(i, 1); |
||||
break; |
||||
} |
||||
} |
||||
}, |
||||
} |
||||
} |
||||
|
||||
get: function (key) { |
||||
return this.map[key]; |
||||
}, |
||||
size() { |
||||
return this.array.length; |
||||
} |
||||
|
||||
toArray: function () { |
||||
var array = []; |
||||
this.each(function (key, value) { |
||||
array.push(value); |
||||
}); |
||||
return array; |
||||
each(fn, scope) { |
||||
scope = scope || window; |
||||
fn = fn || null; |
||||
if (fn == null || typeof (fn) !== "function") { |
||||
return; |
||||
} |
||||
}; |
||||
})(); |
||||
for (let i = 0; i < this.array.length; i++) { |
||||
const key = this.array[i]; |
||||
const value = this.map[key]; |
||||
const re = fn.call(scope, key, value, i, this.array, this.map); |
||||
if (re == false) { |
||||
break; |
||||
} |
||||
} |
||||
} |
||||
|
||||
get(key) { |
||||
return this.map[key]; |
||||
} |
||||
|
||||
toArray() { |
||||
const array = []; |
||||
this.each(function (key, value) { |
||||
array.push(value); |
||||
}); |
||||
return array; |
||||
} |
||||
} |
||||
|
@ -1,89 +1,86 @@
|
||||
import {contains, remove} from "../2.base"; |
||||
|
||||
!(function () { |
||||
BI.Queue = function (capacity) { |
||||
export class Queue { |
||||
constructor(capacity) { |
||||
this.capacity = capacity; |
||||
this.array = []; |
||||
}; |
||||
BI.Queue.prototype = { |
||||
constructor: BI.Queue, |
||||
|
||||
contains: function (v) { |
||||
return BI.contains(this.array, v); |
||||
}, |
||||
|
||||
indexOf: function (v) { |
||||
return BI.contains(this.array, v); |
||||
}, |
||||
|
||||
getElementByIndex: function (index) { |
||||
return this.array[index]; |
||||
}, |
||||
|
||||
push: function (v) { |
||||
this.array.push(v); |
||||
if (this.capacity && this.array.length > this.capacity) { |
||||
this.array.shift(); |
||||
} |
||||
}, |
||||
} |
||||
|
||||
pop: function () { |
||||
this.array.pop(); |
||||
}, |
||||
contains(v) { |
||||
return contains(this.array, v); |
||||
} |
||||
|
||||
indexOf(v) { |
||||
return contains(this.array, v); |
||||
} |
||||
|
||||
getElementByIndex(index) { |
||||
return this.array[index]; |
||||
} |
||||
|
||||
shift: function () { |
||||
push(v) { |
||||
this.array.push(v); |
||||
if (this.capacity && this.array.length > this.capacity) { |
||||
this.array.shift(); |
||||
}, |
||||
} |
||||
} |
||||
|
||||
unshift: function (v) { |
||||
this.array.unshift(v); |
||||
if (this.capacity && this.array.length > this.capacity) { |
||||
this.array.pop(); |
||||
} |
||||
}, |
||||
pop() { |
||||
this.array.pop(); |
||||
} |
||||
|
||||
shift() { |
||||
this.array.shift(); |
||||
} |
||||
|
||||
unshift(v) { |
||||
this.array.unshift(v); |
||||
if (this.capacity && this.array.length > this.capacity) { |
||||
this.array.pop(); |
||||
} |
||||
} |
||||
|
||||
remove: function (v) { |
||||
BI.remove(this.array, v); |
||||
}, |
||||
remove(v) { |
||||
remove(this.array, v); |
||||
} |
||||
|
||||
splice: function () { |
||||
this.array.splice.apply(this.array, arguments); |
||||
}, |
||||
splice() { |
||||
this.array.splice.apply(this.array, arguments); |
||||
} |
||||
|
||||
slice: function () { |
||||
this.array.slice.apply(this.array, arguments); |
||||
}, |
||||
slice() { |
||||
this.array.slice.apply(this.array, arguments); |
||||
} |
||||
|
||||
size: function () { |
||||
return this.array.length; |
||||
}, |
||||
size() { |
||||
return this.array.length; |
||||
} |
||||
|
||||
each: function (fn, scope) { |
||||
var scope = scope || window; |
||||
var fn = fn || null; |
||||
if (fn == null || typeof (fn) !== "function") { |
||||
return; |
||||
} |
||||
for (var i = 0; i < this.array.length; i++) { |
||||
var re = fn.call(scope, i, this.array[i], this.array); |
||||
if (re == false) { |
||||
break; |
||||
} |
||||
each(fn, scope) { |
||||
scope = scope || window; |
||||
fn = fn || null; |
||||
if (fn == null || typeof (fn) !== "function") { |
||||
return; |
||||
} |
||||
for (let i = 0; i < this.array.length; i++) { |
||||
const re = fn.call(scope, i, this.array[i], this.array); |
||||
if (re === false) { |
||||
break; |
||||
} |
||||
}, |
||||
} |
||||
} |
||||
|
||||
toArray: function () { |
||||
return this.array; |
||||
}, |
||||
toArray() { |
||||
return this.array; |
||||
} |
||||
|
||||
fromArray(array) { |
||||
array.each(v => this.push(v)); |
||||
} |
||||
|
||||
clear() { |
||||
this.array.length = 0; |
||||
} |
||||
} |
||||
|
||||
fromArray: function (array) { |
||||
var self = this; |
||||
BI.each(array, function (i, v) { |
||||
self.push(v); |
||||
}); |
||||
}, |
||||
|
||||
clear: function () { |
||||
this.array.length = 0; |
||||
} |
||||
}; |
||||
})(); |
@ -1,517 +1,521 @@
|
||||
(function () { |
||||
BI.Tree = function () { |
||||
this.root = new BI.Node(BI.UUID()); |
||||
}; |
||||
|
||||
BI.Tree.prototype = { |
||||
constructor: BI.Tree, |
||||
addNode: function (node, newNode, index) { |
||||
if (BI.isNull(newNode)) { |
||||
this.root.addChild(node, index); |
||||
} else if (BI.isNull(node)) { |
||||
this.root.addChild(newNode, index); |
||||
} else { |
||||
node.addChild(newNode, index); |
||||
} |
||||
}, |
||||
|
||||
isRoot: function (node) { |
||||
return node === this.root; |
||||
}, |
||||
|
||||
getRoot: function () { |
||||
return this.root; |
||||
}, |
||||
|
||||
clear: function () { |
||||
this.root.clear(); |
||||
}, |
||||
|
||||
initTree: function (nodes) { |
||||
var self = this; |
||||
this.clear(); |
||||
var queue = []; |
||||
BI.each(nodes, function (i, node) { |
||||
var n = new BI.Node(node); |
||||
n.set("data", node); |
||||
self.addNode(n); |
||||
queue.push(n); |
||||
}); |
||||
while (!BI.isEmpty(queue)) { |
||||
var parent = queue.shift(); |
||||
var node = parent.get("data"); |
||||
BI.each(node.children, function (i, child) { |
||||
var n = new BI.Node(child); |
||||
n.set("data", child); |
||||
queue.push(n); |
||||
self.addNode(parent, n); |
||||
}); |
||||
} |
||||
}, |
||||
import { |
||||
isObject, |
||||
UUID, |
||||
extend, |
||||
isEmpty, |
||||
isArray, |
||||
first, |
||||
last, |
||||
findIndex, |
||||
isUndefined, |
||||
isNull, |
||||
each, |
||||
deepClone, |
||||
isEqual, some, every, clone |
||||
} from "../2.base"; |
||||
|
||||
export class Node { |
||||
constructor(id) { |
||||
if (isObject(id)) { |
||||
extend(this, id); |
||||
} else { |
||||
this.id = id; |
||||
} |
||||
this.clear(); |
||||
} |
||||
|
||||
_toJSON: function (node) { |
||||
var self = this; |
||||
var children = []; |
||||
BI.each(node.getChildren(), function (i, child) { |
||||
children.push(self._toJSON(child)); |
||||
}); |
||||
return BI.extend({ |
||||
id: node.id |
||||
}, BI.deepClone(node.get("data")), (children.length > 0 ? { |
||||
children: children |
||||
} : {})); |
||||
}, |
||||
|
||||
toJSON: function (node) { |
||||
var self = this, result = []; |
||||
BI.each((node || this.root).getChildren(), function (i, child) { |
||||
result.push(self._toJSON(child)); |
||||
}); |
||||
return result; |
||||
}, |
||||
|
||||
_toJSONWithNode: function (node) { |
||||
var self = this; |
||||
var children = []; |
||||
BI.each(node.getChildren(), function (i, child) { |
||||
children.push(self._toJSONWithNode(child)); |
||||
}); |
||||
return BI.extend({ |
||||
id: node.id |
||||
}, BI.deepClone(node.get("data")), { |
||||
node: node |
||||
}, (children.length > 0 ? { |
||||
children: children |
||||
} : {})); |
||||
}, |
||||
|
||||
toJSONWithNode: function (node) { |
||||
var self = this, result = []; |
||||
BI.each((node || this.root).getChildren(), function (i, child) { |
||||
result.push(self._toJSONWithNode(child)); |
||||
set(key, value) { |
||||
if (isObject(key)) { |
||||
extend(this, key); |
||||
return; |
||||
} |
||||
this[key] = value; |
||||
} |
||||
|
||||
get(key) { |
||||
return this[key]; |
||||
} |
||||
|
||||
isLeaf() { |
||||
return isEmpty(this.children); |
||||
} |
||||
|
||||
getChildren() { |
||||
return this.children; |
||||
} |
||||
|
||||
getChildrenLength() { |
||||
return this.children.length; |
||||
} |
||||
|
||||
getFirstChild() { |
||||
return first(this.children); |
||||
} |
||||
|
||||
getLastChild() { |
||||
return last(this.children); |
||||
} |
||||
|
||||
setLeft(left) { |
||||
this.left = left; |
||||
} |
||||
|
||||
getLeft() { |
||||
return this.left; |
||||
} |
||||
|
||||
setRight(right) { |
||||
this.right = right; |
||||
} |
||||
|
||||
getRight() { |
||||
return this.right; |
||||
} |
||||
|
||||
setParent(parent) { |
||||
this.parent = parent; |
||||
} |
||||
|
||||
getParent() { |
||||
return this.parent; |
||||
} |
||||
|
||||
getChild(index) { |
||||
return this.children[index]; |
||||
} |
||||
|
||||
getChildIndex(id) { |
||||
return findIndex(this.children, function (i, ch) { |
||||
return ch.get("id") === id; |
||||
}); |
||||
} |
||||
|
||||
removeChild(id) { |
||||
this.removeChildByIndex(this.getChildIndex(id)); |
||||
} |
||||
|
||||
removeChildByIndex(index) { |
||||
const before = this.getChild(index - 1); |
||||
const behind = this.getChild(index + 1); |
||||
if (before != null) { |
||||
before.setRight(behind || null); |
||||
} |
||||
if (behind != null) { |
||||
behind.setLeft(before || null); |
||||
} |
||||
this.children.splice(index, 1); |
||||
} |
||||
|
||||
removeAllChilds() { |
||||
this.children = []; |
||||
} |
||||
|
||||
addChild(child, index) { |
||||
let cur = null; |
||||
if (isUndefined(index)) { |
||||
cur = this.children.length - 1; |
||||
} else { |
||||
cur = index - 1; |
||||
} |
||||
child.setParent(this); |
||||
if (cur >= 0) { |
||||
this.getChild(cur) && this.getChild(cur).setRight(child); |
||||
child.setLeft(this.getChild(cur)); |
||||
} |
||||
if (isUndefined(index)) { |
||||
this.children.push(child); |
||||
} else { |
||||
this.children.splice(index, 0, child); |
||||
} |
||||
} |
||||
|
||||
equals(obj) { |
||||
return this === obj || this.id === obj.id; |
||||
} |
||||
|
||||
clear() { |
||||
this.parent = null; |
||||
this.left = null; |
||||
this.right = null; |
||||
this.children = []; |
||||
} |
||||
} |
||||
|
||||
export class Tree { |
||||
constructor() { |
||||
this.root = new Node(UUID()); |
||||
} |
||||
|
||||
addNode(node, newNode, index) { |
||||
if (isNull(newNode)) { |
||||
this.root.addChild(node, index); |
||||
} else if (isNull(node)) { |
||||
this.root.addChild(newNode, index); |
||||
} else { |
||||
node.addChild(newNode, index); |
||||
} |
||||
} |
||||
|
||||
isRoot(node) { |
||||
return node === this.root; |
||||
} |
||||
|
||||
getRoot() { |
||||
return this.root; |
||||
} |
||||
|
||||
clear() { |
||||
this.root.clear(); |
||||
} |
||||
|
||||
initTree(nodes) { |
||||
this.clear(); |
||||
const queue = []; |
||||
each(nodes, (i, node) => { |
||||
const n = new Node(node); |
||||
n.set("data", node); |
||||
this.addNode(n); |
||||
queue.push(n); |
||||
}); |
||||
while (!isEmpty(queue)) { |
||||
const parent = queue.shift(); |
||||
const node = parent.get("data"); |
||||
each(node.children, (i, child) => { |
||||
const n = new Node(child); |
||||
n.set("data", child); |
||||
queue.push(n); |
||||
this.addNode(parent, n); |
||||
}); |
||||
return result; |
||||
}, |
||||
} |
||||
} |
||||
|
||||
_toJSON(node) { |
||||
const children = []; |
||||
each(node.getChildren(), (i, child) => { |
||||
children.push(this._toJSON(child)); |
||||
}); |
||||
return extend({ |
||||
id: node.id, |
||||
}, deepClone(node.get("data")), (children.length > 0 ? { |
||||
children: children, |
||||
} : {})); |
||||
} |
||||
|
||||
toJSON(node) { |
||||
const result = []; |
||||
each((node || this.root).getChildren(), (i, child) => { |
||||
result.push(this._toJSON(child)); |
||||
}); |
||||
return result; |
||||
} |
||||
|
||||
_toJSONWithNode(node) { |
||||
const children = []; |
||||
each(node.getChildren(), (i, child) => { |
||||
children.push(this._toJSONWithNode(child)); |
||||
}); |
||||
return extend({ |
||||
id: node.id, |
||||
}, deepClone(node.get("data")), { |
||||
node: node, |
||||
}, (children.length > 0 ? { |
||||
children: children, |
||||
} : {})); |
||||
} |
||||
|
||||
toJSONWithNode(node) { |
||||
const result = []; |
||||
each((node || this.root).getChildren(), (i, child) => { |
||||
result.push(this._toJSONWithNode(child)); |
||||
}); |
||||
return result; |
||||
} |
||||
|
||||
search(root, target, param) { |
||||
if (!(root instanceof Node)) { |
||||
return this.search(this.root, root, target); |
||||
} |
||||
let next = null; |
||||
|
||||
search: function (root, target, param) { |
||||
if (!(root instanceof BI.Node)) { |
||||
return arguments.callee.apply(this, [this.root, root, target]); |
||||
if (isNull(target)) { |
||||
return null; |
||||
} |
||||
if (isEqual(root[param || "id"], target)) { |
||||
return root; |
||||
} |
||||
some(root.getChildren(), (i, child) => { |
||||
next = this.search(child, target, param); |
||||
if (null !== next) { |
||||
return true; |
||||
} |
||||
var self = this, next = null; |
||||
|
||||
if (BI.isNull(target)) { |
||||
return null; |
||||
}); |
||||
return next; |
||||
} |
||||
|
||||
_traverse(node, callback) { |
||||
let queue = []; |
||||
queue.push(node); |
||||
while (!isEmpty(queue)) { |
||||
const temp = queue.shift(); |
||||
const b = callback && callback(temp); |
||||
if (b === false) { |
||||
break; |
||||
} |
||||
if (BI.isEqual(root[param || "id"], target)) { |
||||
return root; |
||||
if (b === true) { |
||||
continue; |
||||
} |
||||
BI.any(root.getChildren(), function (i, child) { |
||||
next = self.search(child, target, param); |
||||
if (null !== next) { |
||||
return true; |
||||
} |
||||
}); |
||||
return next; |
||||
}, |
||||
|
||||
_traverse: function (node, callback) { |
||||
var queue = []; |
||||
queue.push(node); |
||||
while (!BI.isEmpty(queue)) { |
||||
var temp = queue.shift(); |
||||
var b = callback && callback(temp); |
||||
if (b === false) { |
||||
break; |
||||
} |
||||
if (b === true) { |
||||
continue; |
||||
} |
||||
if (temp != null) { |
||||
queue = queue.concat(temp.getChildren()); |
||||
} |
||||
if (temp != null) { |
||||
queue = queue.concat(temp.getChildren()); |
||||
} |
||||
}, |
||||
|
||||
traverse: function (callback) { |
||||
this._traverse(this.root, callback); |
||||
}, |
||||
|
||||
_recursion: function (node, route, callback) { |
||||
var self = this; |
||||
return BI.every(node.getChildren(), function (i, child) { |
||||
var next = BI.clone(route); |
||||
next.push(child.id); |
||||
var b = callback && callback(child, next); |
||||
if (b === false) { |
||||
return false; |
||||
} |
||||
if (b === true) { |
||||
return true; |
||||
} |
||||
return self._recursion(child, next, callback); |
||||
}); |
||||
}, |
||||
|
||||
recursion: function (callback) { |
||||
this._recursion(this.root, [], callback); |
||||
}, |
||||
|
||||
inOrderTraverse: function (callback) { |
||||
this._inOrderTraverse(this.root, callback); |
||||
}, |
||||
|
||||
// 中序遍历(递归)
|
||||
_inOrderTraverse: function (node, callback) { |
||||
if (node != null) { |
||||
this._inOrderTraverse(node.getLeft()); |
||||
callback && callback(node); |
||||
this._inOrderTraverse(node.getRight()); |
||||
} |
||||
} |
||||
|
||||
traverse(callback) { |
||||
this._traverse(this.root, callback); |
||||
} |
||||
|
||||
_recursion(node, route, callback) { |
||||
return every(node.getChildren(), (i, child) => { |
||||
const next = clone(route); |
||||
next.push(child.id); |
||||
const b = callback && callback(child, next); |
||||
if (b === false) { |
||||
return false; |
||||
} |
||||
}, |
||||
|
||||
// 中序遍历(非递归)
|
||||
nrInOrderTraverse: function (callback) { |
||||
|
||||
var stack = []; |
||||
var node = this.root; |
||||
while (node != null || !BI.isEmpty(stack)) { |
||||
while (node != null) { |
||||
stack.push(node); |
||||
node = node.getLeft(); |
||||
} |
||||
node = stack.pop(); |
||||
callback && callback(node); |
||||
node = node.getRight(); |
||||
if (b === true) { |
||||
return true; |
||||
} |
||||
}, |
||||
return this._recursion(child, next, callback); |
||||
}); |
||||
} |
||||
|
||||
recursion(callback) { |
||||
this._recursion(this.root, [], callback); |
||||
} |
||||
|
||||
inOrderTraverse(callback) { |
||||
this._inOrderTraverse(this.root, callback); |
||||
} |
||||
|
||||
// 中序遍历(递归)
|
||||
_inOrderTraverse(node, callback) { |
||||
if (node != null) { |
||||
this._inOrderTraverse(node.getLeft()); |
||||
callback && callback(node); |
||||
this._inOrderTraverse(node.getRight()); |
||||
} |
||||
} |
||||
|
||||
preOrderTraverse: function (callback) { |
||||
this._preOrderTraverse(this.root, callback); |
||||
}, |
||||
// 中序遍历(非递归)
|
||||
nrInOrderTraverse(callback) { |
||||
|
||||
// 先序遍历(递归)
|
||||
_preOrderTraverse: function (node, callback) { |
||||
if (node != null) { |
||||
callback && callback(node); |
||||
this._preOrderTraverse(node.getLeft()); |
||||
this._preOrderTraverse(node.getRight()); |
||||
const stack = []; |
||||
let node = this.root; |
||||
while (node != null || !isEmpty(stack)) { |
||||
while (node != null) { |
||||
stack.push(node); |
||||
node = node.getLeft(); |
||||
} |
||||
}, |
||||
|
||||
// 先序遍历(非递归)
|
||||
nrPreOrderTraverse: function (callback) { |
||||
|
||||
var stack = []; |
||||
var node = this.root; |
||||
node = stack.pop(); |
||||
callback && callback(node); |
||||
node = node.getRight(); |
||||
} |
||||
} |
||||
|
||||
preOrderTraverse(callback) { |
||||
this._preOrderTraverse(this.root, callback); |
||||
} |
||||
|
||||
// 先序遍历(递归)
|
||||
_preOrderTraverse(node, callback) { |
||||
if (node != null) { |
||||
callback && callback(node); |
||||
this._preOrderTraverse(node.getLeft()); |
||||
this._preOrderTraverse(node.getRight()); |
||||
} |
||||
} |
||||
|
||||
while (node != null || !BI.isEmpty(stack)) { |
||||
// 先序遍历(非递归)
|
||||
nrPreOrderTraverse(callback) { |
||||
|
||||
while (node != null) { |
||||
callback && callback(node); |
||||
stack.push(node); |
||||
node = node.getLeft(); |
||||
} |
||||
node = stack.pop(); |
||||
node = node.getRight(); |
||||
} |
||||
}, |
||||
const stack = []; |
||||
let node = this.root; |
||||
|
||||
postOrderTraverse: function (callback) { |
||||
this._postOrderTraverse(this.root, callback); |
||||
}, |
||||
while (node != null || !isEmpty(stack)) { |
||||
|
||||
// 后序遍历(递归)
|
||||
_postOrderTraverse: function (node, callback) { |
||||
if (node != null) { |
||||
this._postOrderTraverse(node.getLeft()); |
||||
this._postOrderTraverse(node.getRight()); |
||||
while (node != null) { |
||||
callback && callback(node); |
||||
stack.push(node); |
||||
node = node.getLeft(); |
||||
} |
||||
}, |
||||
|
||||
// 后续遍历(非递归)
|
||||
nrPostOrderTraverse: function (callback) { |
||||
|
||||
var stack = []; |
||||
var node = this.root; |
||||
var preNode = null;// 表示最近一次访问的节点
|
||||
|
||||
while (node != null || !BI.isEmpty(stack)) { |
||||
|
||||
while (node != null) { |
||||
stack.push(node); |
||||
node = node.getLeft(); |
||||
} |
||||
|
||||
node = BI.last(stack); |
||||
|
||||
if (node.getRight() == null || node.getRight() == preNode) { |
||||
callback && callback(node); |
||||
node = stack.pop(); |
||||
preNode = node; |
||||
node = null; |
||||
} else { |
||||
node = node.getRight(); |
||||
} |
||||
} |
||||
node = stack.pop(); |
||||
node = node.getRight(); |
||||
} |
||||
}; |
||||
|
||||
BI.Node = function (id) { |
||||
if (BI.isObject(id)) { |
||||
BI.extend(this, id); |
||||
} else { |
||||
this.id = id; |
||||
} |
||||
|
||||
postOrderTraverse(callback) { |
||||
this._postOrderTraverse(this.root, callback); |
||||
} |
||||
|
||||
// 后序遍历(递归)
|
||||
_postOrderTraverse(node, callback) { |
||||
if (node != null) { |
||||
this._postOrderTraverse(node.getLeft()); |
||||
this._postOrderTraverse(node.getRight()); |
||||
callback && callback(node); |
||||
} |
||||
this.clear.apply(this, arguments); |
||||
}; |
||||
|
||||
BI.Node.prototype = { |
||||
constructor: BI.Node, |
||||
|
||||
set: function (key, value) { |
||||
if (BI.isObject(key)) { |
||||
BI.extend(this, key); |
||||
return; |
||||
} |
||||
this[key] = value; |
||||
}, |
||||
|
||||
get: function (key) { |
||||
return this[key]; |
||||
}, |
||||
|
||||
isLeaf: function () { |
||||
return BI.isEmpty(this.children); |
||||
}, |
||||
|
||||
getChildren: function () { |
||||
return this.children; |
||||
}, |
||||
|
||||
getChildrenLength: function () { |
||||
return this.children.length; |
||||
}, |
||||
|
||||
getFirstChild: function () { |
||||
return BI.first(this.children); |
||||
}, |
||||
|
||||
getLastChild: function () { |
||||
return BI.last(this.children); |
||||
}, |
||||
} |
||||
|
||||
setLeft: function (left) { |
||||
this.left = left; |
||||
}, |
||||
// 后续遍历(非递归)
|
||||
nrPostOrderTraverse(callback) { |
||||
|
||||
getLeft: function () { |
||||
return this.left; |
||||
}, |
||||
const stack = []; |
||||
let node = this.root; |
||||
let preNode = null;// 表示最近一次访问的节点
|
||||
|
||||
setRight: function (right) { |
||||
this.right = right; |
||||
}, |
||||
while (node != null || !isEmpty(stack)) { |
||||
|
||||
getRight: function () { |
||||
return this.right; |
||||
}, |
||||
|
||||
setParent: function (parent) { |
||||
this.parent = parent; |
||||
}, |
||||
|
||||
getParent: function () { |
||||
return this.parent; |
||||
}, |
||||
|
||||
getChild: function (index) { |
||||
return this.children[index]; |
||||
}, |
||||
|
||||
getChildIndex: function (id) { |
||||
return BI.findIndex(this.children, function (i, ch) { |
||||
return ch.get("id") === id; |
||||
}); |
||||
}, |
||||
|
||||
removeChild: function (id) { |
||||
this.removeChildByIndex(this.getChildIndex(id)); |
||||
}, |
||||
|
||||
removeChildByIndex: function (index) { |
||||
var before = this.getChild(index - 1); |
||||
var behind = this.getChild(index + 1); |
||||
if (before != null) { |
||||
before.setRight(behind || null); |
||||
} |
||||
if (behind != null) { |
||||
behind.setLeft(before || null); |
||||
while (node != null) { |
||||
stack.push(node); |
||||
node = node.getLeft(); |
||||
} |
||||
this.children.splice(index, 1); |
||||
}, |
||||
|
||||
removeAllChilds: function () { |
||||
this.children = []; |
||||
}, |
||||
node = last(stack); |
||||
|
||||
addChild: function (child, index) { |
||||
var cur = null; |
||||
if (BI.isUndefined(index)) { |
||||
cur = this.children.length - 1; |
||||
if (node.getRight() == null || node.getRight() === preNode) { |
||||
callback && callback(node); |
||||
node = stack.pop(); |
||||
preNode = node; |
||||
node = null; |
||||
} else { |
||||
cur = index - 1; |
||||
node = node.getRight(); |
||||
} |
||||
child.setParent(this); |
||||
if (cur >= 0) { |
||||
this.getChild(cur) && this.getChild(cur).setRight(child); |
||||
child.setLeft(this.getChild(cur)); |
||||
} |
||||
} |
||||
|
||||
static transformToArrayFormat(nodes, pId, childKey) { |
||||
if (!nodes) return []; |
||||
let r = []; |
||||
childKey = childKey || "children"; |
||||
if (isArray(nodes)) { |
||||
for (let i = 0, l = nodes.length; i < l; i++) { |
||||
const node = clone(nodes[i]); |
||||
node.pId = node.pId == null ? pId : node.pId; |
||||
delete node.children; |
||||
r.push(node); |
||||
if (nodes[i][childKey]) { |
||||
r = r.concat(Tree.transformToArrayFormat(nodes[i][childKey], node.id)); |
||||
} |
||||
} |
||||
if (BI.isUndefined(index)) { |
||||
this.children.push(child); |
||||
} else { |
||||
this.children.splice(index, 0, child); |
||||
} else { |
||||
const newNodes = clone(nodes); |
||||
newNodes.pId = newNodes.pId == null ? pId : newNodes.pId; |
||||
delete newNodes.children; |
||||
r.push(newNodes); |
||||
if (nodes[childKey]) { |
||||
r = r.concat(Tree.transformToArrayFormat(nodes[childKey], newNodes.id)); |
||||
} |
||||
}, |
||||
|
||||
equals: function (obj) { |
||||
return this === obj || this.id === obj.id; |
||||
}, |
||||
} |
||||
return r; |
||||
} |
||||
|
||||
clear: function () { |
||||
this.parent = null; |
||||
this.left = null; |
||||
this.right = null; |
||||
this.children = []; |
||||
static arrayFormat(nodes, pId) { |
||||
if (!nodes) { |
||||
return []; |
||||
} |
||||
}; |
||||
|
||||
BI.extend(BI.Tree, { |
||||
transformToArrayFormat: function (nodes, pId, childKey) { |
||||
if (!nodes) return []; |
||||
var r = []; |
||||
childKey = childKey || "children"; |
||||
if (BI.isArray(nodes)) { |
||||
for (var i = 0, l = nodes.length; i < l; i++) { |
||||
var node = BI.clone(nodes[i]); |
||||
node.pId = node.pId == null ? pId : node.pId; |
||||
delete node.children; |
||||
r.push(node); |
||||
if (nodes[i][childKey]) { |
||||
r = r.concat(BI.Tree.transformToArrayFormat(nodes[i][childKey], node.id)); |
||||
} |
||||
} |
||||
} else { |
||||
var newNodes = BI.clone(nodes); |
||||
newNodes.pId = newNodes.pId == null ? pId : newNodes.pId; |
||||
delete newNodes.children; |
||||
r.push(newNodes); |
||||
if (nodes[childKey]) { |
||||
r = r.concat(BI.Tree.transformToArrayFormat(nodes[childKey], newNodes.id)); |
||||
let r = []; |
||||
if (isArray(nodes)) { |
||||
for (let i = 0, l = nodes.length; i < l; i++) { |
||||
const node = nodes[i]; |
||||
node.pId = node.pId == null ? pId : node.pId; |
||||
r.push(node); |
||||
if (nodes[i]["children"]) { |
||||
r = r.concat(Tree.arrayFormat(nodes[i]["children"], node.id)); |
||||
} |
||||
} |
||||
return r; |
||||
}, |
||||
|
||||
arrayFormat: function (nodes, pId) { |
||||
if (!nodes) { |
||||
return []; |
||||
} |
||||
var r = []; |
||||
if (BI.isArray(nodes)) { |
||||
for (var i = 0, l = nodes.length; i < l; i++) { |
||||
var node = nodes[i]; |
||||
node.pId = node.pId == null ? pId : node.pId; |
||||
r.push(node); |
||||
if (nodes[i]["children"]) { |
||||
r = r.concat(BI.Tree.arrayFormat(nodes[i]["children"], node.id)); |
||||
} |
||||
} |
||||
} else { |
||||
var newNodes = nodes; |
||||
newNodes.pId = newNodes.pId == null ? pId : newNodes.pId; |
||||
r.push(newNodes); |
||||
if (nodes["children"]) { |
||||
r = r.concat(BI.Tree.arrayFormat(nodes["children"], newNodes.id)); |
||||
} |
||||
} else { |
||||
const newNodes = nodes; |
||||
newNodes.pId = newNodes.pId == null ? pId : newNodes.pId; |
||||
r.push(newNodes); |
||||
if (nodes["children"]) { |
||||
r = r.concat(Tree.arrayFormat(nodes["children"], newNodes.id)); |
||||
} |
||||
return r; |
||||
}, |
||||
} |
||||
return r; |
||||
} |
||||
|
||||
transformToTreeFormat: function (sNodes) { |
||||
var i, l; |
||||
if (!sNodes) { |
||||
return []; |
||||
} |
||||
static transformToTreeFormat(sNodes) { |
||||
let i, l; |
||||
if (!sNodes) { |
||||
return []; |
||||
} |
||||
|
||||
if (BI.isArray(sNodes)) { |
||||
var r = []; |
||||
var tmpMap = {}; |
||||
for (i = 0, l = sNodes.length; i < l; i++) { |
||||
if (BI.isNull(sNodes[i].id)) { |
||||
return sNodes; |
||||
} |
||||
tmpMap[sNodes[i].id] = BI.clone(sNodes[i]); |
||||
if (isArray(sNodes)) { |
||||
const r = []; |
||||
const tmpMap = {}; |
||||
for (i = 0, l = sNodes.length; i < l; i++) { |
||||
if (isNull(sNodes[i].id)) { |
||||
return sNodes; |
||||
} |
||||
for (i = 0, l = sNodes.length; i < l; i++) { |
||||
if (tmpMap[sNodes[i].pId] && sNodes[i].id !== sNodes[i].pId) { |
||||
if (!tmpMap[sNodes[i].pId].children) { |
||||
tmpMap[sNodes[i].pId].children = []; |
||||
} |
||||
tmpMap[sNodes[i].pId].children.push(tmpMap[sNodes[i].id]); |
||||
} else { |
||||
r.push(tmpMap[sNodes[i].id]); |
||||
tmpMap[sNodes[i].id] = clone(sNodes[i]); |
||||
} |
||||
for (i = 0, l = sNodes.length; i < l; i++) { |
||||
if (tmpMap[sNodes[i].pId] && sNodes[i].id !== sNodes[i].pId) { |
||||
if (!tmpMap[sNodes[i].pId].children) { |
||||
tmpMap[sNodes[i].pId].children = []; |
||||
} |
||||
delete tmpMap[sNodes[i].id].pId; |
||||
tmpMap[sNodes[i].pId].children.push(tmpMap[sNodes[i].id]); |
||||
} else { |
||||
r.push(tmpMap[sNodes[i].id]); |
||||
} |
||||
return r; |
||||
delete tmpMap[sNodes[i].id].pId; |
||||
} |
||||
return [sNodes]; |
||||
return r; |
||||
} |
||||
return [sNodes]; |
||||
|
||||
}, |
||||
} |
||||
|
||||
treeFormat: function (sNodes) { |
||||
var i, l; |
||||
if (!sNodes) { |
||||
return []; |
||||
} |
||||
static treeFormat(sNodes) { |
||||
let i, l; |
||||
if (!sNodes) { |
||||
return []; |
||||
} |
||||
|
||||
if (BI.isArray(sNodes)) { |
||||
var r = []; |
||||
var tmpMap = {}; |
||||
for (i = 0, l = sNodes.length; i < l; i++) { |
||||
if (BI.isNull(sNodes[i].id)) { |
||||
return sNodes; |
||||
} |
||||
tmpMap[sNodes[i].id] = sNodes[i]; |
||||
if (isArray(sNodes)) { |
||||
const r = []; |
||||
const tmpMap = {}; |
||||
for (i = 0, l = sNodes.length; i < l; i++) { |
||||
if (isNull(sNodes[i].id)) { |
||||
return sNodes; |
||||
} |
||||
for (i = 0, l = sNodes.length; i < l; i++) { |
||||
if (tmpMap[sNodes[i].pId] && sNodes[i].id !== sNodes[i].pId) { |
||||
if (!tmpMap[sNodes[i].pId].children) { |
||||
tmpMap[sNodes[i].pId].children = []; |
||||
} |
||||
tmpMap[sNodes[i].pId].children.push(tmpMap[sNodes[i].id]); |
||||
} else { |
||||
r.push(tmpMap[sNodes[i].id]); |
||||
tmpMap[sNodes[i].id] = sNodes[i]; |
||||
} |
||||
for (i = 0, l = sNodes.length; i < l; i++) { |
||||
if (tmpMap[sNodes[i].pId] && sNodes[i].id !== sNodes[i].pId) { |
||||
if (!tmpMap[sNodes[i].pId].children) { |
||||
tmpMap[sNodes[i].pId].children = []; |
||||
} |
||||
tmpMap[sNodes[i].pId].children.push(tmpMap[sNodes[i].id]); |
||||
} else { |
||||
r.push(tmpMap[sNodes[i].id]); |
||||
} |
||||
return r; |
||||
} |
||||
return [sNodes]; |
||||
return r; |
||||
} |
||||
return [sNodes]; |
||||
|
||||
}, |
||||
} |
||||
|
||||
traversal: function (array, callback, pNode) { |
||||
if (BI.isNull(array)) { |
||||
return; |
||||
} |
||||
var self = this; |
||||
BI.some(array, function (i, item) { |
||||
if (callback(i, item, pNode) === false) { |
||||
return true; |
||||
} |
||||
self.traversal(item.children, callback, item); |
||||
}); |
||||
static traversal(array, callback, pNode) { |
||||
if (isNull(array)) { |
||||
return; |
||||
} |
||||
}); |
||||
})(); |
||||
some(array, (i, item) => { |
||||
if (callback(i, item, pNode) === false) { |
||||
return true; |
||||
} |
||||
this.traversal(item.children, callback, item); |
||||
}); |
||||
} |
||||
} |
||||
|
Loading…
Reference in new issue