utilja
Version:
util for js
56 lines (54 loc) • 1.78 kB
JavaScript
/*
* Copyright (c) JinLiwei 2022-present
*/
/**
*
* @param obj obj traversed
* @param objContainer objContainer containing obj
* @param key key for obj
* @param level obj level relative to root
* @param nullCallback called when obj is null or undefined
* @param arrayCallback called when obj is array
* @param objCallback called when obj is object
* @param primitiveCallback called when obj is primitive
*/
function traverse(obj, objContainer, key, level, {nullCallback, arrayCallback, objCallback, primitiveCallback}) {
if (obj === null || obj === undefined) {
if (typeof nullCallback === 'function') {
nullCallback(obj, objContainer, key, level);
}
return;
}
if (Array.isArray(obj)) {
if (typeof arrayCallback === 'function') {
arrayCallback(obj, objContainer, key, level);
}
for (let i = 0; i < obj.length; i++) {
traverse(obj[i], obj, i, level + 1, {nullCallback, arrayCallback, objCallback, primitiveCallback});
}
return;
}
if (typeof obj === 'object') {
if (typeof objCallback === 'function') {
objCallback(obj, objContainer, key, level);
}
let keys = Object.keys(obj);
if (keys) {
keys.forEach(itemKey => {
traverse(obj[itemKey], obj, itemKey, level + 1, {
nullCallback,
arrayCallback,
objCallback,
primitiveCallback
});
});
}
return;
}
if (typeof primitiveCallback === 'function') {
primitiveCallback(obj, objContainer, key, level);
}
}
module.exports = {
traverse
}