每次都在我要在控制台中查看对象时,我想扩展它,因此不得不单击箭头来每次都变得很烦人:)是否有快捷方式或设置可以自动完成?
每次都在我要在控制台中查看对象时,我想扩展它,因此不得不单击箭头来每次都变得很烦人:)是否有快捷方式或设置可以自动完成?
Answers:
尽管在大多数情况下解决方案提及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
是非标准的。
考虑使用console.table()。
要扩展/折叠节点及其所有子节点,
Ctrl + Alt +单击或选择+单击箭头图标
(请注意,尽管开发工具文档列出了Ctrl + Alt + Click,但在Windows上,仅需Alt + Click)。
可能不是最佳答案,但是我一直在代码中的某个位置进行此操作。
更新:
用于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
不是最好的解决方案,但可以很好地用于我的用途。更深的对象将无法工作,因此可以对其进行改进。
pretty(a)
);在所有的网站在任何时候
console.table
,浅扩展,“ Option / Alt + Click”是手动过程,编写使用underscore.js的自定义函数不值得)开销)
这是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);
这是我的解决方案,一个迭代对象的所有属性(包括数组)的函数。
在此示例中,我遍历了一个简单的多级对象:
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,'$'))
如果您有一个大对象,则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)
我真的不喜欢Chrome和Safari如何控制台对象(过度设计)。默认情况下,控制台会压缩对象,在对象展开时对对象键进行排序,并显示原型链中的内部功能。这些功能应为启用设置。默认情况下,开发人员可能会对原始结果感兴趣,因此他们可以检查其代码是否正常工作。这些功能会减慢开发速度,并给出错误的排序结果。
推荐的
console.log(JSON.stringify({}, undefined, 2));
也可以用作功能:
console.json = object => console.log(JSON.stringify(object, undefined, 2));
console.json({});
“ Option + Click”(在Mac上为Chrome)和“ Alt + Click”(在Windows上为Chrome),
但是,并非所有浏览器(例如Safari)都支持它,并且Console仍会打印原型类型链,当扩展等
不建议
我不推荐任何一个最佳答案
console.table()
-这仅是浅扩展,不会扩展嵌套对象
编写一个自定义的underscore.js函数-应该是一个简单的解决方案的开销太大
您可以在这里看到:
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... } }
我不主张所有权,仅引用有用的资料。