Как избавиться от нескольких вызовов методов

Это исправление для ответов @Trey Mack и @Freddie Nfbnm в typeof obj != 'object'. Вместо этого он должен проверить, является ли значение obj не экземпляром объекта, так что он также может работать при проверке значений с знакомности объекта (например, функции и символы (символы не являются экземпляром объекта, но все еще адресованы, кстати. )).

Я отправляю это как ответ, так как я еще не могу комментировать эту учетную запись StackExchange.

PS .: не стесняйтесь просить меня удалить этот ответ.

function isCyclic(obj) {
  var keys = [];
  var stack = [];
  var stackSet = new Set();
  var detected = false;

  function detect(obj, key) {
    if (!(obj instanceof Object)) { return; } // Now works with other
                                              // kinds of object.

    if (stackSet.has(obj)) { // it's cyclic! Print the object and its locations.
      var oldindex = stack.indexOf(obj);
      var l1 = keys.join('.') + '.' + key;
      var l2 = keys.slice(0, oldindex + 1).join('.');
      console.log('CIRCULAR: ' + l1 + ' = ' + l2 + ' = ' + obj);
      console.log(obj);
      detected = true;
      return;
    }

    keys.push(key);
    stack.push(obj);
    stackSet.add(obj);
    for (var k in obj) { //dive on the object's children
      if (obj.hasOwnProperty(k)) { detect(obj[k], k); }
    }

    keys.pop();
    stack.pop();
    stackSet.delete(obj);
    return;
  }

  detect(obj, 'obj');
  return detected;
}
1
задан ray 8 March 2019 в 06:02
поделиться