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