Czy istnieje sposób na automatyczne rozwijanie obiektów w Chrome Dev Tools?


141

KAŻDY RAZ Oglądam obiekt w konsoli, chcę go rozwinąć, więc klikanie strzałki, aby to zrobić KAŻDY RAZ :) Czy istnieje skrót lub ustawienie, które powoduje, że robi się to automatycznie?


4
Nie teraz. Zapraszam do złożenia prośby o funkcję na new.crbug.com (rozpocznij podsumowanie od przedrostka „DevTools:”), ale określ dokładnie, gdzie i które obiekty chcesz rozwinąć. Np. Z pewnością nigdy nie będziesz chciał, aby WSZYSTKIE obiekty zostały rozszerzone, ponieważ mogą (a) mieć ogromną liczbę właściwości; (b) zawierają cykle (w tym drugim przypadku rozwinięcie całego drzewa zajmie trochę czasu ;))
Alexander Pavlov


1
Dzięki za to Nikita, opublikowałem komentarz z alternatywnym rozwiązaniem.
Jeremy Smith

9
z radością wybrałbym skrót klawiaturowy. boli mnie, że muszę iść do myszy ...
rynek

3
Dlaczego to jeszcze nie zostało wdrożone 4 lata później?
user3751385

Odpowiedzi:


31

Choć rozwiązanie wspomnieć JSON.stringifyjest dość dobre dla większości przypadków, to ma kilka ograniczeń

  • Nie radzi sobie z przedmiotami z okrągłymi odnośnikami, gdzie console.logmożna elegancko zadbać o takie przedmioty.
  • Ponadto, jeśli masz duże drzewo, możliwość interaktywnego składania niektórych węzłów może ułatwić eksplorację.

Oto rozwiązanie (wykorzystuje bibliotekę underscore.js ), które rozwiązuje oba powyższe przez twórcze (ab) użycie console.group:

expandedLog = (function(){
    var MAX_DEPTH = 100;

    return function(item, depth){

        depth = depth || 0;

        if (depth > MAX_DEPTH ) {
            console.log(item);
            return;
        }

        if (_.isObject(item)) {
            _.each(item, function(value, key) {
            console.group(key + ' : ' +(typeof value));
            expandedLog(value, depth + 1);
            console.groupEnd();
            });
        } else {
            console.log(item);
        }
    }
})();

Teraz działa:

expandedLog({
    "glossary": {
        "title": "example glossary",
        "GlossDiv": {
            "title": "S",
            "GlossList": {
                "GlossEntry": {
                    "ID": "SGML",
                    "SortAs": "SGML",
                    "GlossTerm": "Standard Generalized Markup Language",
                    "Acronym": "SGML",
                    "Abbrev": "ISO 8879:1986",
                    "GlossDef": {
                        "para": "A meta-markup language, used to create markup languages such as DocBook.",
                        "GlossSeeAlso": ["GML", "XML"]
                    },
                    "GlossSee": "markup"
                }
            }
        }
    }
})

Da ci coś takiego:

zrzut ekranu wyjściowego

Wartość MAX_DEPTH można dostosować do żądanego poziomu, a poza tym poziomem zagnieżdżenia - rozszerzony dziennik powróci do zwykłego console.log

Spróbuj uruchomić coś takiego:

x = { a: 10, b: 20 }
x.x = x 
expandedLog(x)

wprowadź opis obrazu tutaj

Zauważ, że zależność podkreślenia można łatwo usunąć - po prostu wyodrębnij wymagane funkcje ze źródła .

Należy również pamiętać, że console.groupjest to niestandardowe.




64

Aby rozwinąć / zwinąć węzeł i wszystkie jego elementy podrzędne,

Ctrl + Alt + kliknięcie lub Opt + kliknięcie ikony strzałki

(zauważ, że chociaż dokumentacja narzędzi programistycznych zawiera Ctrl + Alt + kliknięcie, w systemie Windows wszystko, czego potrzeba, to Alt + kliknięcie).


3
To jest właściwie pełna odpowiedź na rzeczywiste pytanie.
Ross Patterson

3
Testując to w OSX chrome 46, rozszerza również cały prototypowy obiekt, co sprawia, że ​​jest tak źle, jak kliknięcie każdej strzałki. Zamiast tego musisz znaleźć właściwości (hasOwn) w połowie 50 prototypowych metod, właściwości itp ...
Kev

w ten sposób pojawia się błąd Uncaught ReferenceError: _ nie jest zdefiniowany błąd
MagePsycho

5
Tylko uwaga na marginesie. W przypadku obiektów o ogromnej głębi należy kilkakrotnie nacisnąć Ctrl + Alt + Klik, aż rozwinie cały obiekt, a nie tylko raz.
BentCoder,

Prawidłowo odpowiada na pytanie. Mimo że nadal wymaga od użytkownika ręcznego kliknięcia obiektu w konsoli, a rozwiązanie nie jest powszechnie obsługiwane w różnych przeglądarkach.
tfmontague

34

Może nie jest to najlepsza odpowiedź, ale robiłem to gdzieś w moim kodzie.

Aktualizacja :

Użyj, JSON.stringifyaby automatycznie rozwinąć obiekt:

> a = [{name: 'Joe', age: 5}, {name: 'John', age: 6}]
> JSON.stringify(a, true, 2)
"[
  {
    "name": "Joe",
    "age": 5
  },
  {
    "name": "John",
    "age": 6
  }
]"

Zawsze możesz utworzyć funkcję skrótu, jeśli boli Cię wpisanie tego wszystkiego:

j = function(d) {
    return JSON.stringify(d, true, 2)
}

j(a)

Poprzednia odpowiedź:

pretty = function(d)
{
  var s = []
  for (var k in d) {
    s.push(k + ': ' + d[k])
  }
  console.log(s.join(', '))
}

wtedy zamiast:

-> a = [{name: 'Joe', age: 5}, {name: 'John', age: 6}]
-> a
<- [Object, Object]

Ty robisz:

-> a.forEach(pretty)
<- name: Joe, age: 5
   name: John, age: 6

Nie jest to najlepsze rozwiązanie, ale działa dobrze w moim przypadku. Głębsze obiekty nie będą działać, więc można to poprawić.


Para to z Dodawanie niestandardowych funkcjonalności do konsoli Chrome i możemy mieć pretty(a)we wszystkich miejscach w każdym czasie;)
brasofilo

Właściwie powiedziałbym, że to niestety najlepsza odpowiedź - inne rozwiązania są gorsze (np. console.tablePłytkie rozwinięcie, „Option / Alt + Click” to proces ręczny, a pisanie niestandardowej funkcji używającej podkreślenia.js nie jest warte nad głową)
tfmontague

8

opcja + Kliknij na komputerze Mac. Właśnie odkryłem to teraz i zrobiłem mój tydzień! To było równie irytujące jak cokolwiek innego


8

Oto zmodyfikowana wersja odpowiedzi Lorefnona, która nie zależy od podkreślenia:

var expandedLog = (function(MAX_DEPTH){

    return function(item, depth){

        depth    = depth || 0;
        isString = typeof item === 'string'; 
        isDeep   = depth > MAX_DEPTH

        if (isString || isDeep) {
            console.log(item);
            return;
        }

        for(var key in item){
            console.group(key + ' : ' +(typeof item[key]));
            expandedLog(item[key], depth + 1);
            console.groupEnd();
        }
    }
})(100);

2

Oto moje rozwiązanie, funkcja, która iteruje wszystkie właściwości obiektu, w tym tablice.

W tym przykładzie iteruję po prostym obiekcie wielopoziomowym:

    var point = {
            x: 5,
            y: 2,
            innerobj : { innerVal : 1,innerVal2 : 2 },
            $excludedInnerProperties : { test: 1},
            includedInnerProperties : { test: 1}
        };

Masz również możliwość wykluczenia iteracji, jeśli właściwości zaczynają się od określonego przyrostka (np. $ Dla obiektów kątowych)

discoverProperties = function (obj, level, excludePrefix) {
        var indent = "----------------------------------------".substring(0, level * 2);
        var str = indent + "level " + level + "\r\n";
        if (typeof (obj) == "undefined")
            return "";
        for (var property in obj) {
            if (obj.hasOwnProperty(property)) {
                var propVal;
                try {
                    propVal = eval('obj.' + property);
                    str += indent + property + "(" + propVal.constructor.name + "):" + propVal + "\r\n";
                    if (typeof (propVal) == 'object' && level < 10 && propVal.constructor.name != "Date" && property.indexOf(excludePrefix) != 0) {
                        if (propVal.hasOwnProperty('length')) {
                            for (var i = 0; i < propVal.length; i++) {
                                if (typeof (propVal) == 'object' && level < 10) {
                                    if (typeof (propVal[i]) != "undefined") {
                                        str += indent + (propVal[i]).constructor.name + "[" + i + "]\r\n";
                                        str += this.discoverProperties(propVal[i], level + 1, excludePrefix);
                                    }
                                }
                                else
                                    str += indent + propVal[i].constructor.name + "[" + i + "]:" + propVal[i] + "\r\n";
                            }
                        }
                        else
                            str += this.discoverProperties(propVal, level + 1, excludePrefix);
                    }
                }
                catch (e) {
                }
            }
        }
        return str;
    };


var point = {
        x: 5,
        y: 2,
        innerobj : { innerVal : 1,innerVal2 : 2 },
        $excludedInnerProperties : { test: 1},
        includedInnerProperties : { test: 1}
    };

document.write("<pre>" + discoverProperties(point,0,'$')+ "</pre>");

Oto wynik funkcji:

level 0
x(Number):5
y(Number):2
innerobj(Object):[object Object]
--level 1
--innerVal(Number):1
--innerVal2(Number):2
$excludedInnerProperties(Object):[object Object]
includedInnerProperties(Object):[object Object]
--level 1
--test(Number):1

Możesz również wstrzyknąć tę funkcję na dowolnej stronie internetowej i skopiować i przeanalizować wszystkie właściwości, spróbuj na stronie Google za pomocą polecenia chrome:

discoverProperties(google,0,'$')

Możesz również skopiować dane wyjściowe polecenia za pomocą polecenia chrome:

copy(discoverProperties(myvariable,0,'$'))

2

jeśli masz duży obiekt, JSON.stringfy wyświetli błąd Uncaught TypeError: Konwertowanie struktury cyklicznej na JSON, oto sztuczka, aby użyć zmodyfikowanej wersji tego

JSON.stringifyOnce = function(obj, replacer, indent){
    var printedObjects = [];
    var printedObjectKeys = [];

    function printOnceReplacer(key, value){
        if ( printedObjects.length > 2000){ // browsers will not print more than 20K, I don't see the point to allow 2K.. algorithm will not be fast anyway if we have too many objects
        return 'object too long';
        }
        var printedObjIndex = false;
        printedObjects.forEach(function(obj, index){
            if(obj===value){
                printedObjIndex = index;
            }
        });

        if ( key == ''){ //root element
             printedObjects.push(obj);
            printedObjectKeys.push("root");
             return value;
        }

        else if(printedObjIndex+"" != "false" && typeof(value)=="object"){
            if ( printedObjectKeys[printedObjIndex] == "root"){
                return "(pointer to root)";
            }else{
                return "(see " + ((!!value && !!value.constructor) ? value.constructor.name.toLowerCase()  : typeof(value)) + " with key " + printedObjectKeys[printedObjIndex] + ")";
            }
        }else{

            var qualifiedKey = key || "(empty key)";
            printedObjects.push(value);
            printedObjectKeys.push(qualifiedKey);
            if(replacer){
                return replacer(key, value);
            }else{
                return value;
            }
        }
    }
    return JSON.stringify(obj, printOnceReplacer, indent);
};

teraz możesz użyć JSON.stringifyOnce(obj)


2

Naprawdę nie jestem fanem tego, jak obiekty konsol Chrome i Safari są (zbyt rozbudowane). Konsola domyślnie zagęszcza obiekt, sortuje klucze obiektów, gdy obiekt jest rozwijany i wyświetla funkcje wewnętrzne z łańcucha prototypów. Te funkcje powinny być ustawieniami akceptacji. Deweloperzy domyślnie są prawdopodobnie zainteresowani nieprzetworzonymi wynikami, aby mogli sprawdzić, czy ich kod działa poprawnie; te funkcje spowalniają rozwój i dają nieprawidłowe wyniki sortowania.

Jak rozwinąć obiekty w Console

Zalecana

  1. console.log(JSON.stringify({}, undefined, 2));

    Można również użyć jako funkcji:

    console.json = object => console.log(JSON.stringify(object, undefined, 2));
    
    console.json({});
    
  2. „Option + Click” (Chrome na Macu) i „Alt + Click” (Chrome na Window)
    Jednak nie jest obsługiwany przez wszystkie przeglądarki (np. Safari), a konsola nadal drukuje łańcuchy typów prototypów, klucze obiektów są automatycznie sortowane, gdy rozszerzony itp.

Niepolecane

Nie polecałbym żadnej z najlepszych odpowiedzi

  1. console.table() - jest to tylko płytka ekspansja i nie rozwija zagnieżdżonych obiektów

  2. Napisz niestandardową funkcję underscore.js - za dużo narzutów na to, co powinno być prostym rozwiązaniem


1

To praca, ale działa dla mnie.

Używam w przypadku, gdy kontrolka / widżet aktualizuje się automatycznie w zależności od działań użytkownika. Na przykład, gdy używasz twittera typeahead.js, gdy wyostrzysz się poza okno, menu znika, a sugestie są usuwane z DOM.

W narzędziach deweloperskich kliknij prawym przyciskiem myszy węzeł, który chcesz rozwinąć, włącz przerwę na ... -> modyfikacje poddrzewa , spowoduje to wysłanie do debugera. Naciskaj F10 lub Shift + F11, aż dom mutuje. Gdy to zmutuje, możesz sprawdzić. Ponieważ debugger jest aktywny, interfejs użytkownika przeglądarki Chrome jest zablokowany i nie zamyka menu, a sugestie nadal znajdują się w DOM.

Bardzo przydatne podczas rozwiązywania problemów z układem dynamicznie wstawianych węzłów, które są stale wstawiane i usuwane.


0

Byłby inny łatwiejszy sposób

  • Użyj JSON.stringify (jsonObject)
  • Skopiuj i wklej wynik do programu Visual Studio Code
  • Użyj Ctrl + K i Ctrl + F, aby sformatować wynik
  • Zobaczysz sformatowany rozwinięty obiekt

Próbowałem tego dla prostych obiektów.


-2

Możesz wyświetlić swój element, uzyskując dostęp do document.getElementsBy ..., a następnie kliknij prawym przyciskiem myszy i skopiuj wynikowy obiekt. Na przykład:

document.getElementsByTagName('ion-app') zwraca obiekt javascript, który można skopiować i wkleić do edytora tekstu i robi to w całości.

Jeszcze lepiej: kliknij prawym przyciskiem myszy wynikowy element - „Edytuj jako html” - „Wybierz wszystko” - „Kopiuj” - „Wklej”


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.