替换以下划线

时间:2015-09-16 19:44:12

标签: javascript node.js recursion

我正在尝试编写一个函数来替换名称以下划线替换名称和破折号。如果以带有短划线的下划线开头,则替换第一个字符。到目前为止,我已经做了以下事情;但我需要一些帮助来递归地为嵌套对象做这件事;我正在寻找一种优雅的方式:

    var myObj = { name: 'foo',
      bar: {"_foo": {'_bar':{}}},
      '_baz': {}};


Object.prototype.replaceUnderscores = function rec() {
    for (var item in this){
      if(typeof this[item] == "object"){
        this[item] = rec(this[item])
      }
      if(_.startsWith(item, '_')){
        console.log(item)
        var newName = item.replace(item[0],'-')
        this[newName] = this[item];
        delete this[item]
      }
    }
    return this;
};

myObj.replaceUnderscores()

console.log(myObj);

1 个答案:

答案 0 :(得分:1)

我在尝试你的代码时遇到了一些错误(_未在startsWith调用中定义)。也没有看到需要命名该函数,因为它被指定为原型,但以下工作:

var myObj = { 
    name: 'foo',
    bar: {
        "_foo": {
            '_bar': {}
        }
    },
    '_baz': {}
};

console.log('before: %o', myObj);

Object.prototype.replaceUnderscores = function() {
    for (var item in this){
      if(typeof this[item] == "object"){
        this[item] = this[item].replaceUnderscores();
      }

      if(item.startsWith('_')){

        var newName = item.replace(item[0],'-');
        console.log(item + ' / ' + newName);
        this[newName] = this[item];
        delete this[item]
      }
    }
    return this;
};

console.log('after: %o', myObj.replaceUnderscores());

工作fiddle

<强>更新

我现在看到了错误。你说的是什么

this[item] = rec(this[item])

我说

this[item] = this[item].replaceUnderscores();

即使您将该函数命名为未将要更改的对象作为参数传递 - 它也是对象原型的一部分,它可以在this上运行。