我想有一个自定义检查功能,用于node.js中的util.inspect来专门处理数组

时间:2015-12-17 08:32:38

标签: node.js customization inspect

鉴于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文本鹦鹉作为。

2 个答案:

答案 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] } } } }