foop
Version:
interfaces that describe their intentions.
48 lines (42 loc) • 4.42 kB
JavaScript
// https://github.com/andrewplummer/Sugar/blob/master/lib/common.js#L766
function iterateWithCyclicCheck(obj, sortedKeys, stack, fn) {
function next(val, key) {
var cyc = false
// Allowing a step into the structure before triggering this check to save
// cycles on standard JSON structures and also to try as hard as possible to
// catch basic properties that may have been modified.
if (stack.length > 1) {
var i = stack.length
while (i--) {
if (stack[i] === val) {
cyc = true
}
}
}
stack.push(val)
fn(key, val, cyc, stack)
stack.pop()
}
function iterateWithSortedKeys() {
// Sorted keys is required for serialization, where object order
// does not matter but stringified order does.
var arr = getKeys(obj).sort(), key
for (var i = 0; i < arr.length; i++) {
key = arr[i]
next(obj[key], arr[i])
}
}
// This method for checking for cyclic structures was egregiously stolen from
// the ingenious method by @kitcambridge from the Underscore script:
// https://github.com/documentcloud/underscore/issues/240
if (!stack) {
stack = []
}
if (sortedKeys) {
iterateWithSortedKeys()
}
else {
forEachProperty(obj, next)
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aEN5Y2xpY2FsQ2hlY2suanMiLCJzb3VyY2VzIjpbIndpdGhDeWNsaWNhbENoZWNrLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmRyZXdwbHVtbWVyL1N1Z2FyL2Jsb2IvbWFzdGVyL2xpYi9jb21tb24uanMjTDc2NlxuZnVuY3Rpb24gaXRlcmF0ZVdpdGhDeWNsaWNDaGVjayhvYmosIHNvcnRlZEtleXMsIHN0YWNrLCBmbikge1xuICBmdW5jdGlvbiBuZXh0KHZhbCwga2V5KSB7XG4gICAgdmFyIGN5YyA9IGZhbHNlXG5cbiAgICAvLyBBbGxvd2luZyBhIHN0ZXAgaW50byB0aGUgc3RydWN0dXJlIGJlZm9yZSB0cmlnZ2VyaW5nIHRoaXMgY2hlY2sgdG8gc2F2ZVxuICAgIC8vIGN5Y2xlcyBvbiBzdGFuZGFyZCBKU09OIHN0cnVjdHVyZXMgYW5kIGFsc28gdG8gdHJ5IGFzIGhhcmQgYXMgcG9zc2libGUgdG9cbiAgICAvLyBjYXRjaCBiYXNpYyBwcm9wZXJ0aWVzIHRoYXQgbWF5IGhhdmUgYmVlbiBtb2RpZmllZC5cbiAgICBpZiAoc3RhY2subGVuZ3RoID4gMSkge1xuICAgICAgdmFyIGkgPSBzdGFjay5sZW5ndGhcbiAgICAgIHdoaWxlIChpLS0pIHtcbiAgICAgICAgaWYgKHN0YWNrW2ldID09PSB2YWwpIHtcbiAgICAgICAgICBjeWMgPSB0cnVlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBzdGFjay5wdXNoKHZhbClcbiAgICBmbihrZXksIHZhbCwgY3ljLCBzdGFjaylcbiAgICBzdGFjay5wb3AoKVxuICB9XG5cbiAgZnVuY3Rpb24gaXRlcmF0ZVdpdGhTb3J0ZWRLZXlzKCkge1xuICAgIC8vIFNvcnRlZCBrZXlzIGlzIHJlcXVpcmVkIGZvciBzZXJpYWxpemF0aW9uLCB3aGVyZSBvYmplY3Qgb3JkZXJcbiAgICAvLyBkb2VzIG5vdCBtYXR0ZXIgYnV0IHN0cmluZ2lmaWVkIG9yZGVyIGRvZXMuXG4gICAgdmFyIGFyciA9IGdldEtleXMob2JqKS5zb3J0KCksIGtleVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICBrZXkgPSBhcnJbaV1cbiAgICAgIG5leHQob2JqW2tleV0sIGFycltpXSlcbiAgICB9XG4gIH1cblxuICAvLyBUaGlzIG1ldGhvZCBmb3IgY2hlY2tpbmcgZm9yIGN5Y2xpYyBzdHJ1Y3R1cmVzIHdhcyBlZ3JlZ2lvdXNseSBzdG9sZW4gZnJvbVxuICAvLyB0aGUgaW5nZW5pb3VzIG1ldGhvZCBieSBAa2l0Y2FtYnJpZGdlIGZyb20gdGhlIFVuZGVyc2NvcmUgc2NyaXB0OlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vZG9jdW1lbnRjbG91ZC91bmRlcnNjb3JlL2lzc3Vlcy8yNDBcbiAgaWYgKCFzdGFjaykge1xuICAgIHN0YWNrID0gW11cbiAgfVxuXG4gIGlmIChzb3J0ZWRLZXlzKSB7XG4gICAgaXRlcmF0ZVdpdGhTb3J0ZWRLZXlzKClcbiAgfVxuICBlbHNlIHtcbiAgICBmb3JFYWNoUHJvcGVydHkob2JqLCBuZXh0KVxuICB9XG59XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQSxTQUFTLHNCQUFzQixDQUFDLEdBQUcsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRTtFQUMxRCxTQUFTLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFO0lBQ3RCLElBQUksR0FBRyxHQUFHLEtBQUs7Ozs7O0lBS2YsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtNQUNwQixJQUFJLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTTtNQUNwQixPQUFPLENBQUMsRUFBRSxFQUFFO1FBQ1YsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFO1VBQ3BCLEdBQUcsR0FBRyxJQUFJO1NBQ1g7T0FDRjtLQUNGOztJQUVELEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO0lBQ2YsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQztJQUN4QixLQUFLLENBQUMsR0FBRyxFQUFFO0dBQ1o7O0VBRUQsU0FBUyxxQkFBcUIsR0FBRzs7O0lBRy9CLElBQUksR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxHQUFHO0lBQ2xDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO01BQ25DLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO01BQ1osSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDdkI7R0FDRjs7Ozs7RUFLRCxJQUFJLENBQUMsS0FBSyxFQUFFO0lBQ1YsS0FBSyxHQUFHLEVBQUU7R0FDWDs7RUFFRCxJQUFJLFVBQVUsRUFBRTtJQUNkLHFCQUFxQixFQUFFO0dBQ3hCO09BQ0k7SUFDSCxlQUFlLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQztHQUMzQjtDQUNGOyJ9