data-traversal
Version:
a tool for tree data traversing
92 lines (78 loc) • 3.02 kB
JavaScript
/**
* @file traversal.js 遍历方法
* @author clarkt(clarktanglei@163.com)
*/
(function () {
var traversal = {
/**
* 非递归广度遍历
*
* @param {Array} arr 数据源
* @param {Function(obj, res, event)} step 遍历到每个节点时触发的回调,可返回任意值,
* 作为遍历到下一个节点时回调的第二个参数res,或者是遍历结束时的返回,
* 如果在执行过程中想中断遍历,可设置event.break = true;
* @param {*=} res 遍历结果初始值
* @param {string=} key 子节点key
* @return {*} 遍历结果
*/
breadth: function (arr, step, res, key) {
key = key || 'children';
// 浅拷贝数据源
var queue = arr.slice();
var event = {};
while (queue.length) {
var obj = queue.shift();
if (obj && obj[key] && obj[key].length) {
queue = queue.concat(obj[key]);
}
res = step(obj, res, event);
// 当用户手动break 时,终止遍历
if (event.break) {
return res;
}
}
return res;
},
/**
* 非递归深度遍历
*
* @param {Array} arr 数据源
* @param {Function(obj, res, event)} step 遍历到每个节点时触发的回调,可返回任意值,
* 作为遍历到下一个节点时回调的第二个参数res,或者是遍历结束时的返回,
* 如果在执行过程中想中断遍历,可设置event.break = true;
* @param {*=} res 遍历结果初始值
* @param {string=} key 子节点key
* @return {*} 遍历结果
*/
depth: function (arr, step, res, key) {
key = key || 'children';
// 入栈
var stack = arr.slice().reverse();
var event = {};
while (stack.length) {
var obj = stack.pop();
if (obj && obj[key] && obj[key].length) {
stack = stack.concat(obj[key].slice().reverse());
}
res = step(obj, res, event);
// 当用户手动break时,终止遍历
if (event.break) {
return res;
}
}
return res;
}
};
if (typeof module !== 'undefined' && typeof exports === 'object') {
module.exports = traversal;
}
else if (typeof define === 'function' && (define.amd || define.cmd)) {
define(function () {
return traversal;
});
}
else {
this.traversal = traversal;
}
})
.call(this);