Tim*_*imo 6 javascript recursion mootools functional-programming data-structures
我有一个包含未知数量的其他对象的对象.每个(子)对象可以包含布尔值作为字符串,我想将它们更改为实际的布尔值.这是一个示例对象:
var myObj = {
my1stLevelKey1: "true",
my1stLevelKey2: "a normal string",
my1stLevelKey3: {
my2ndLevelKey1: {
my3rdLevelKey1: {
my4thLevelKey1: "true",
my4thLevelKey2: "false"
}
},
my2ndLevelKey2: {
my3rdLevelKey2: "FALSE"
}
}
}
Run Code Online (Sandbox Code Playgroud)
我最终想要的是:
var myObj = {
my1stLevelKey1: true,
my1stLevelKey2: "a normal string",
my1stLevelKey3: {
my2ndLevelKey1: {
my3rdLevelKey1: {
my4thLevelKey1: true,
my4thLevelKey2: false
}
},
my2ndLevelKey2: {
my3rdLevelKey2: false
}
}
}
Run Code Online (Sandbox Code Playgroud)
重要的是数字子对象/级别是未知的.如何使用经典JavaScript或Mootools有效地做到这一点?
Pau*_* S. 16
递归是你的朋友
(function (obj) { // IIFE so you don't pollute your namespace
// define things you can share to save memory
var map = Object.create(null);
map['true'] = true;
map['false'] = false;
// the recursive iterator
function walker(obj) {
var k,
has = Object.prototype.hasOwnProperty.bind(obj);
for (k in obj) if (has(k)) {
switch (typeof obj[k]) {
case 'object':
walker(obj[k]); break;
case 'string':
if (obj[k].toLowerCase() in map) obj[k] = map[obj[k].toLowerCase()]
}
}
}
// set it running
walker(obj);
}(myObj));
Run Code Online (Sandbox Code Playgroud)
这obj[k].toLowerCase()是为了使它不区分大小写