鉴于var a = {a:'a', b:'b', c:[1,2,3], d:{ d1:{ d2:{ d3:[1,2,3] }}}};
我想从console.log( util.inspect( a, {depth:null}));
{ a: 'a',
b: 'b',
c: Array[3],
d: { d1: { d2: { d3: Array[3] } } } }
我尝试了以下内容,但我得到的只是undefined
a.inspect = function(depth){
var self = this;
Object.keys(self).forEach( function(key){
if(Array.isArray(self[key])){
return key+': Array['+self[key].length+']';
}else{
return util.inspect(self[key]);
}
});
};
documentation at node.js并不是非常有用,我在Google上找到的所有网页都只是将node.js文本鹦鹉作为。
答案 0 :(得分:0)
问题是你的return
语句引用了用于迭代这些项的内联函数,因此inspect
函数根本不会返回任何内容。
要解决此问题,您可以使用(阻塞)for
循环迭代条目并从那里返回。
除此之外,您应该累积每个键的子结果,并且最后只返回。
我喜欢(未经测试):
a.inspect = function(depth) {
var result = '{';
for (var key in this) {
if (Array.isArray(this[key]))
result += key + ': Array[' + this[key].length + ']';
else
result += util.inspect(this[key]);
}
result += '}';
return result;
};
请注意您不需要替换this
,因为您总是在同一个闭包中。
答案 1 :(得分:0)
塞德里克,你是对的,我没有从检查中返回任何东西 - 试图在凌晨4点编写代码的危险!但我似乎无法摆脱使用self=this
,因为我似乎必须继续将inspect函数附加到内部对象。经过进一步的实验,我最终得到的东西并不像util.inspect那样完全格式化,但它足够接近我的目的。
var util=require('util');
var a = {a:'a', b:'b', c:[1,2,3], d:{ d1:{ d2: { d3:[1,2,3] }}, dd1: { dd2: { dd3: [1,2,3]}}}};
a.inspect = function(depth){
var self = this;
var sp = ' ';
return '{ ' + Object.keys(self).reduce( function(str,key){
if( key==='inspect' && typeof self[key]==='function' ) return str ;
if(Array.isArray(self[key])){
return str+(str?',\n'+sp.repeat(depth+1):'')+key+': Array['+self[key].length+']';
}else{
if( typeof self[key] === 'object' ) self[key].inspect=a.inspect ;
return str+(str?',\n'+sp.repeat(depth+1):'')+key+': '+util.inspect(self[key], {colors:true,depth:null});
}
}, '') + ' }'
};
console.log( util.inspect( a, {colors:true,depth:null} ));
这需要支持repeat方法的节点版本,否则请参阅MDN以获取polyfill。这是输出:
{ a: 'a',
b: 'b',
c: Array[3],
d: { d1: { d2: { d3: Array[3] } },
dd1: { dd2: { dd3: Array[3] } } } }