КАЖДЫЙ РАЗ Я просматриваю объект в консоли, и я хочу его развернуть, поэтому становится утомительно щелкать стрелку, чтобы делать это КАЖДЫЙ РАЗ :) Есть ли ярлык или настройка, чтобы это выполнялось автоматически?
КАЖДЫЙ РАЗ Я просматриваю объект в консоли, и я хочу его развернуть, поэтому становится утомительно щелкать стрелку, чтобы делать это КАЖДЫЙ РАЗ :) Есть ли ярлык или настройка, чтобы это выполнялось автоматически?
Ответы:
Хотя упомянутое решение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
это нестандартно.
Рассмотрите возможность использования console.table () .
Чтобы развернуть / свернуть узел и все его дочерние элементы,
Ctrl + Alt + щелчок или Opt + щелчок по значку стрелки
(обратите внимание, что хотя в документации инструментов разработчика перечислены 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);
Я действительно не поклонник того, как Chrome и Safari консольные объекты (чрезмерно спроектированные). Консоль по умолчанию уплотняет объект, сортирует ключи объекта при раскрытии объекта и показывает внутренние функции из цепочки прототипов. Эти функции должны быть включены в настройки. Разработчики по умолчанию, вероятно, заинтересованы в необработанных результатах, чтобы они могли проверить, правильно ли работает их код; и эти функции замедляют разработку и дают неверные результаты сортировки.
рекомендуемые
console.log(JSON.stringify({}, undefined, 2));
Также можно использовать как функцию:
console.json = object => console.log(JSON.stringify(object, undefined, 2));
console.json({});
«Option + Click» (Chrome на Mac) и «Alt + Click» (Chrome в Window).
Однако он поддерживается не всеми браузерами (например, Safari), и консоль по-прежнему печатает цепочки типов прототипов, ключи объектов автоматически сортируются, когда расширенный и др.
Не рекомендуется
Я бы не рекомендовал ни один из лучших ответов
console.table()
- это только неглубокое расширение и не расширяет вложенные объекты
Напишите пользовательскую функцию underscore.js - слишком много накладных расходов для того, что должно быть простым решением
Вот мое решение - функция, которая выполняет итерацию всех свойств объекта, включая массивы.
В этом примере я перебираю простой многоуровневый объект:
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,'$'))
если у вас большой объект, 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)
Это работа, но она работает для меня.
Я использую в том случае, когда элемент управления / виджет автоматически обновляется в зависимости от действий пользователя. Например, при использовании twitter typeahead.js, когда вы фокусируетесь за окном, раскрывающийся список исчезает, и предложения удаляются из DOM.
В инструментах разработчика щелкните правой кнопкой мыши узел, который вы хотите развернуть, включить разрыв при ... -> модификации поддерева , это отправит вас в отладчик. Продолжайте нажимать F10 или Shift + F11, пока dom не изменится. Как только это изменится, вы можете проверить. Поскольку отладчик активен, пользовательский интерфейс Chrome заблокирован и не закрывает раскрывающийся список, а предложения все еще находятся в DOM.
Очень удобно при устранении проблем с компоновкой динамически вставляемых узлов, которые постоянно вставляются и удаляются.
Другой более простой способ был бы
Я пробовал это для простых объектов.
Вы можете просмотреть свой элемент, открыв document.getElementsBy ..., а затем щелкните правой кнопкой мыши и скопируйте полученный объект. Например:
document.getElementsByTagName('ion-app')
возвращает объект javascript, который можно скопировать и вставить в текстовый редактор, и делает это полностью.
Еще лучше: щелкните правой кнопкой мыши полученный элемент - «Изменить как html» - «Выбрать все» - «Копировать» - «Вставить»
Вы можете увидеть здесь:
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... } }
Я не претендую на владение этим, просто ссылаюсь на полезный источник.