Chrome开发工具中是否可以自动展开对象?


140

每次都在我要在控制台中查看对象时,我想扩展它,因此不得不单击箭头来每次都变得很烦人:)是否有快捷方式或设置可以自动完成?


4
现在不行。随意在文件功能要求new.crbug.com(先从摘要中注明“DevTools:”前缀),但非常具体的关于地方哪些对象,您想要扩大。例如,您肯定将永远不想扩展所有对象,因为它们可能(a)具有大量的属性;(b)包含循环(在后一种情况下,整个树的展开将需要一段时间;))
Alexander Pavlov 2012年


1
感谢Nikita,我发表了评论以及其他解决方案。
杰里米·史密斯

9
我很乐意选择键盘快捷键。它的痛苦,我不必去鼠标...
市场

3
为什么四年后仍未实施?
user3751385

Answers:


31

尽管在大多数情况下解决方案提及JSON.stringify都非常出色,但它也有一些局限性

  • 它不能处理带有圆形引用的项目,因为它们console.log可以优雅地处理此类对象。
  • 另外,如果您有一棵大树,则可以交互式折叠一些节点,这会使探索变得更容易。

这是一个解决方案(使用underscore.js库),该解决方案通过创造性地(ab)使用解决了以上两个问题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);
        }
    }
})();

现在正在运行:

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

会给你类似的东西:

输出截图

可以将MAX_DEPTH的值调整到所需的级别,并且超出该嵌套级别-扩展的日志将退回到通常的console.log

尝试运行以下内容:

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

在此处输入图片说明

请注意,下划线依赖性可以轻松删除-只需从源代码中提取所需的函数即可。

另外请注意,这console.group是非标准的。




64

要扩展/折叠节点及其所有子节点,

Ctrl + Alt +单击选择+单击箭头图标

(请注意,尽管开发工具文档列出了Ctrl + Alt + Click,但在Windows上,仅需Alt + Click)。


3
这实际上是对实际问题的完整答案。
罗斯·帕特森

3
测试是在OSX chrome 46中进行的,它也扩展了所有原型对象,这使其与单击每个箭头一样糟糕。相反,您必须在50个原型方法,属性等中间找到属性(hasOwn)
Kev 2015年

这给出了未捕获的ReferenceError:_未定义错误
MagePsycho

5
只是一个旁注。对于深度很大的对象,应按几次Ctrl + Alt + Click组合键,直到它扩展整个对象,而不是一次。
BentCoder

正确回答问题。尽管仍然需要用户在控制台中手动单击该对象,但是该解决方案在浏览器中不受普遍支持。
tfmontague '19

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

8

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

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

您也可以在任何网页中插入此功能,然后复制并分析所有属性,然后使用chrome命令在google页面上尝试:

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)


2

我真的不喜欢Chrome和Safari如何控制台对象(过度设计)。默认情况下,控制台会压缩对象,在对象展开时对对象键进行排序,并显示原型链中的内部功能。这些功能应为启用设置。默认情况下,开发人员可能会对原始结果感兴趣,因此他们可以检查其代码是否正常工作。这些功能会减慢开发速度,并给出错误的排序结果。

如何在控制台中展开对象

推荐的

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

    也可以用作功能:

    console.json = object => console.log(JSON.stringify(object, undefined, 2));
    
    console.json({});
    
  2. “ Option + Click”(在Mac上为Chrome)和“ Alt + Click”(在Windows上为Chrome),
    但是,并非所有浏览器(例如Safari)都支持它,并且Console仍会打印原型类型链,当扩展等

不建议

我不推荐任何一个最佳答案

  1. console.table() -这仅是浅扩展,不会扩展嵌套对象

  2. 编写一个自定义的underscore.js函数-应该是一个简单的解决方案的开销太大


1

它可以解决,但对我有用。

在控件/窗口小部件根据用户操作自动更新的情况下,我会使用它。例如,当使用twitter的typeahead.js时,一旦您将焦点放在窗口之外,下拉列表就会消失,并且建议也会从DOM中删除。

在开发工具中,右键单击要扩展的节点,然后单击“ ->子树修改”,这会将您发送到调试器。继续按F10Shift + F11直到您进行dom突变。一旦突变,您就可以检查。由于调试器处于活动状态,因此Chrome的用户界面已锁定,并且无法关闭下拉菜单,并且建议仍在DOM中。

对开始不断插入和删除的动态插入节点的布局进行故障排除时非常方便。


0

另一个更简单的方法是

  • 使用JSON.stringify(jsonObject)
  • 将结果复制并粘贴到Visual Studio Code
  • 使用Ctrl + K和Ctrl + F格式化结果
  • 您将看到格式化的扩展对象

我已经尝试过用于简单对象。



-2

您可以通过访问document.getElementsBy ...来查看元素,然后右键单击并复制结果对象。例如:

document.getElementsByTagName('ion-app') 会返回可复制粘贴到文本编辑器的javascript对象,它会完全执行此操作。

更好的是:右键单击结果元素-'编辑为html'-'全选'-'复制'-'粘贴'

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.