recursiveEach - rekursywna iteracja po obiekcie. Funkcja do prawidłowego działania wymaga również 2 innych funkcji znajdujących się na tym blogu: getType oraz each.
Funkcję można dodatkowo rozbudować. Np. idealnie byłoby, gdyby w docelowej funkcji zamiast samej wartości klucza zwracała tablicę stringów wskazujących na ścieżkę do tego klucza w głównym obiekcie.
var recursiveEach = function recur(obj, fn, depth) {
if (typeof depth === 'undefined')
depth = -1;
var res = {};
if (getType(obj) === 'Object' && depth !== 0) {
each(obj, function (el, key) {
res[key] = recur(el, fn, depth - 1);
});
return res;
}
return fn(obj);
};
var recursiveEach = function recur(obj, fn, depth) {
if (typeof depth === 'undefined')
depth = -1;
var res = {};
if (getType(obj) === 'Object' && depth !== 0) {
each(obj, function (el, key) {
res[key] = recur(el, fn, depth - 1);
});
return res;
}
return fn(obj);
};
var getType = function (obj) {
return ({}).toString.call(obj).slice(8, -1);
};
var each = function (obj, fn) {
var res = {};
for (var i in obj) {
if (obj.hasOwnProperty(i)) {
res[i] = fn.call(obj, obj[i], i);
}
}
return res;
};
var getType = function (obj) {
return ({}).toString.call(obj).slice(8, -1);
};
var each = function (obj, fn) {
var res = {};
for (var i in obj) {
if (obj.hasOwnProperty(i)) {
res[i] = fn.call(obj, obj[i], i);
}
}
return res;
};
Przy pomocy tej funkcji łatwo zaimplementować funkcję flatten. Do funkcji flatten można przekazać zarówno obiekt jak i tablicę.
var flatten = function(obj) {
var res = [];
recursiveEach(obj, function(val) {
res.push(val);
});
return res;
};
var flatten = function(obj) {
var res = [];
recursiveEach(obj, function(val) {
res.push(val);
});
return res;
};