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?
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?
Odpowiedzi:
Choć rozwiązanie wspomnieć JSON.stringify
jest dość dobre dla większości przypadków, to ma kilka ograniczeń
console.log
można elegancko zadbać o takie przedmioty.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:
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)
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.group
jest to niestandardowe.
Rozważ użycie console.table () .
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).
Może nie jest to najlepsza odpowiedź, ale robiłem to gdzieś w moim kodzie.
Aktualizacja :
Użyj, JSON.stringify
aby 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ć.
pretty(a)
we wszystkich miejscach w każdym czasie;)
console.table
Pł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ą)
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);
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,'$'))
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)
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.
Zalecana
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({});
„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
console.table()
- jest to tylko płytka ekspansja i nie rozwija zagnieżdżonych obiektów
Napisz niestandardową funkcję underscore.js - za dużo narzutów na to, co powinno być prostym rozwiązaniem
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.
Byłby inny łatwiejszy sposób
Próbowałem tego dla prostych obiektów.
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”
Możesz zobaczyć tutaj:
https://www.angularjswiki.com/angular/how-to-read-local-json-files-in-angular/
Najprostszy sposób:
import SampleJson from '../../assets/SampleJson.json';
...
console.log(SampleJson);
Musisz także dodać następujący kod do tsconfig:
{ "compilerOptions": { ..."resolveJsonModule": true, "esModuleInterop": true... } }
Nie roszczę sobie do tego prawa własności, po prostu odsyłam do pomocnego źródła.