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