Есть ли способ автоматически расширять объекты в Chrome Dev Tools?


146

КАЖДЫЙ РАЗ Я просматриваю объект в консоли, и я хочу его развернуть, поэтому становится утомительно щелкать стрелку, чтобы делать это КАЖДЫЙ РАЗ :) Есть ли ярлык или настройка, чтобы это выполнялось автоматически?


4
Не в данный момент. Не стесняйтесь отправлять запрос функции на new.crbug.com (начните сводку с префикса «DevTools:»), но будьте очень конкретны в том, где и какие объекты вы хотите развернуть. Например, вы, конечно , никогда не захотите, чтобы ВСЕ ваши объекты были развернуты, поскольку они могут (а) иметь огромное количество свойств; (б) содержать циклы (в последнем случае нужно время, чтобы развернуть все дерево;))
Александр Павлов


1
Спасибо за это, Никита, я опубликовал комментарий с альтернативным решением.
Джереми Смит

9
я бы с радостью согласился на сочетание клавиш. мне больно переходить на мышь ...
market

3
Почему это еще не было реализовано 4 года спустя?
user3751385

Ответы:


34

Хотя упомянутое решениеJSON.stringify довольно хорошо для большинства случаев, оно имеет несколько ограничений.

  • Он не может обрабатывать элементы с круговыми ссылками, тогда как он console.logможет элегантно заботиться о таких объектах.
  • Кроме того, если у вас есть большое дерево, то возможность интерактивного свертывания некоторых узлов может облегчить исследование.

Вот решение, которое решает оба вышеперечисленных творчески (ab), используя console.group:

function expandedLog(item, maxDepth = 100, depth = 0){
    if (depth > maxDepth ) {
        console.log(item);
        return;
    }
    if (typeof item === 'object' && item !== null) {
        Object.entries(item).forEach(([key, value]) => {
            console.group(key + ' : ' +(typeof value));
            expandedLog(value, maxDepth, depth + 1);
            console.groupEnd();
        });
    } else {
        console.log(item);
    }
}

Сейчас работает:

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"
                }
            }
        }
    }
})

Вы получите что-то вроде:

выходной снимок экрана

Значение maxDepthможно отрегулировать до желаемого уровня, а за пределами этого уровня вложенности - расширенный журнал вернется к обычному console.log

Попробуйте запустить что-нибудь вроде:

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

введите описание изображения здесь

Также обратите внимание, что console.groupэто нестандартно.


Вот версия машинописного текста, которую
Mathieu CAROFF

99

Рассмотрите возможность использования console.table () .

console.table вывод


10
Молодец, я никогда не знал об этом!
Дагоберт Ренуф

Чрезвычайно! Спас мой день!
Николае Олариу

1
Думаю, я говорю от имени всех, кто этого раньше не видел: удивите!
Джон Хант

Выглядит хорошо! Но он сжимает широкие значения, если есть 10+ ключей :(
Systems Rebooter

Я не искал этого ответа, но рад, что нашел!
Джей Камминс,

67

Чтобы развернуть / свернуть узел и все его дочерние элементы,

Ctrl + Alt + щелчок или Opt + щелчок по значку стрелки

(обратите внимание, что хотя в документации инструментов разработчика перечислены Ctrl + Alt + Click, в Windows все, что требуется, это Alt + Click).


4
На самом деле это полный ответ на актуальный вопрос.
Росс Паттерсон

3
Тестирование проводится в OSX chrome 46, он также расширяет весь объект-прототип, что делает его таким же плохим, как необходимость щелкать каждую стрелку. Вместо этого вам нужно найти свойства (hasOwn) среди 50 методов-прототипов, свойств и т. Д.
Кев

это дает Uncaught ReferenceError: _ is not defined error
MagePsycho

5
Просто примечание. В случае объектов с большой глубиной, Ctrl + Alt + Click следует применять несколько раз, пока он не расширит весь объект, а не только один раз.
BentCoder

Правильно отвечает на вопрос. Хотя для этого по-прежнему требуется, чтобы пользователь вручную щелкал объект в консоли, и решение не повсеместно поддерживается браузерами.
tfmontague

34

Возможно, это не лучший ответ, но я делал это где-то в своем коде.

Обновление :

Используйте JSON.stringifyдля автоматического расширения объекта:

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

Вы всегда можете создать функцию быстрого доступа, если вам больно набирать все это:

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

j(a)

Предыдущий ответ:

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

тогда вместо:

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

Ты сделаешь:

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

Не лучшее решение, но подходит для моего использования. Более глубокие объекты не будут работать, так что это можно улучшить.


Добавьте к этому добавление пользовательских функций в консоль Chrome, и мы сможем использовать их pretty(a)на всех сайтах в любое время;)
brasofilo

На самом деле, я бы сказал, что, к сожалению, это лучший ответ - другие решения хуже (т.е. console.tableмелкое расширение, «Option / Alt + Click» - это ручной процесс, и писать пользовательскую функцию, использующую underscore.js, не стоит накладные расходы)
tfmontague

9

option + Щелкните на Mac. Только что обнаружил это сейчас и сделал свою неделю! Это так же раздражает, как и все


8

Вот модифицированная версия ответа lorefnon, которая не зависит от underscorejs:

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);

3

Я действительно не поклонник того, как Chrome и Safari консольные объекты (чрезмерно спроектированные). Консоль по умолчанию уплотняет объект, сортирует ключи объекта при раскрытии объекта и показывает внутренние функции из цепочки прототипов. Эти функции должны быть включены в настройки. Разработчики по умолчанию, вероятно, заинтересованы в необработанных результатах, чтобы они могли проверить, правильно ли работает их код; и эти функции замедляют разработку и дают неверные результаты сортировки.

Как развернуть объекты в консоли

рекомендуемые

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

    Также можно использовать как функцию:

    console.json = object => console.log(JSON.stringify(object, undefined, 2));
    
    console.json({});
    
  2. «Option + Click» (Chrome на Mac) и «Alt + Click» (Chrome в Window).
    Однако он поддерживается не всеми браузерами (например, Safari), и консоль по-прежнему печатает цепочки типов прототипов, ключи объектов автоматически сортируются, когда расширенный и др.

Не рекомендуется

Я бы не рекомендовал ни один из лучших ответов

  1. console.table() - это только неглубокое расширение и не расширяет вложенные объекты

  2. Напишите пользовательскую функцию underscore.js - слишком много накладных расходов для того, что должно быть простым решением


2

Вот мое решение - функция, которая выполняет итерацию всех свойств объекта, включая массивы.

В этом примере я перебираю простой многоуровневый объект:

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

У вас также есть возможность исключить итерацию, если свойства начинаются с определенного суффикса (например, $ для угловых объектов)

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>");

Вот результат работы функции:

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

Вы также можете внедрить эту функцию на любую веб-страницу, скопировать и проанализировать все свойства, попробовать на странице Google с помощью команды chrome:

discoverProperties(google,0,'$')

Также вы можете скопировать вывод команды с помощью команды chrome:

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

2

если у вас большой объект, JSON.stringfy выдаст ошибку Uncaught TypeError: преобразование круговой структуры в JSON, вот трюк, чтобы использовать его модифицированную версию

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);
};

теперь вы можете использовать JSON.stringifyOnce(obj)


1

Это работа, но она работает для меня.

Я использую в том случае, когда элемент управления / виджет автоматически обновляется в зависимости от действий пользователя. Например, при использовании twitter typeahead.js, когда вы фокусируетесь за окном, раскрывающийся список исчезает, и предложения удаляются из DOM.

В инструментах разработчика щелкните правой кнопкой мыши узел, который вы хотите развернуть, включить разрыв при ... -> модификации поддерева , это отправит вас в отладчик. Продолжайте нажимать F10 или Shift + F11, пока dom не изменится. Как только это изменится, вы можете проверить. Поскольку отладчик активен, пользовательский интерфейс Chrome заблокирован и не закрывает раскрывающийся список, а предложения все еще находятся в DOM.

Очень удобно при устранении проблем с компоновкой динамически вставляемых узлов, которые постоянно вставляются и удаляются.


0

Другой более простой способ был бы

  • Используйте JSON.stringify (jsonObject)
  • Скопируйте и вставьте результат в код Visual Studio
  • Используйте Ctrl + K и Ctrl + F для форматирования результата
  • Вы увидите отформатированный развернутый объект

Я пробовал это для простых объектов.


-2

Вы можете просмотреть свой элемент, открыв document.getElementsBy ..., а затем щелкните правой кнопкой мыши и скопируйте полученный объект. Например:

document.getElementsByTagName('ion-app') возвращает объект javascript, который можно скопировать и вставить в текстовый редактор, и делает это полностью.

Еще лучше: щелкните правой кнопкой мыши полученный элемент - «Изменить как html» - «Выбрать все» - «Копировать» - «Вставить»


-2

Вы можете увидеть здесь:

https://www.angularjswiki.com/angular/how-to-read-local-json-files-in-angular/

Самый простой способ:

import SampleJson from '../../assets/SampleJson.json';
...
console.log(SampleJson);

Вы также должны добавить в tsconfig следующий код:

{  "compilerOptions": {  ..."resolveJsonModule": true, "esModuleInterop": true... } }

Я не претендую на владение этим, просто ссылаюсь на полезный источник.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.