isCyclic.js 867 B

1234567891011121314151617181920212223242526272829303132333435363738
  1. var Class = require('./Class');
  2. var keys = require('./keys');
  3. var isObj = require('./isObj');
  4. exports = function(val, parents) {
  5. if (!isObj(val)) {
  6. return false;
  7. }
  8. if (parents && parents.contains(val)) {
  9. return true;
  10. }
  11. parents = new Node(val, parents);
  12. var _keys = keys(val);
  13. for (var i = 0, len = _keys.length; i < len; i++) {
  14. if (exports(val[_keys[i]], parents)) {
  15. return true;
  16. }
  17. }
  18. return false;
  19. };
  20. var Node = Class({
  21. initialize: function Node(val, next) {
  22. this.val = val;
  23. this.next = next;
  24. },
  25. contains: function(val) {
  26. var cursor = this;
  27. while (cursor) {
  28. if (cursor.val === val) {
  29. return true;
  30. }
  31. cursor = cursor.next;
  32. }
  33. return false;
  34. }
  35. });
  36. module.exports = exports;