我正在构建一个递归“按摩”功能,该功能需要重命名某些属性键。我一直在尝试一些递归方法,但到目前为止没有用。
例如,我需要从此深度嵌套对象内的所有数组中删除单词“ Array”。
样本输入:
var input = {
test: {
testArray1: [
{
testArray2: [
{
sample: {
testArray3: [],
},
},
],
},
],
},
};
预期输出:
var output = {
test: {
test1: [
{
test2: [
{
sample: {
test3: [],
},
},
],
},
],
},
};
答案 0 :(得分:4)
最好的方法(无递归)可以是将JSON
转换为string
到JSON.stringify()
,对replace()
进行一些string
操作,然后使用JSON
将其转换回JSON.parse()
,如下所示:
const input = {
test: {testArray1: [
{testArray2: [
{sample: {testArray3: ["Array"],},},
],},
],},
};
let res = JSON.stringify(input).replace(/(Array)([^:]*):/g, "$2:");
res = JSON.parse(res);
console.log(res);
答案 1 :(得分:-1)
这是一种适合您情况的“简单”递归方法:
function removeWord(input, word = "Array") {
if (Array.isArray(input)) {
return input.map(obj => removeWord(obj, word));
} else if (typeof input == "object") {
var result = {};
Object.keys(input).forEach(key => {
result[key.replace(word, "")] = removeWord(input[key]);
});
return result;
} else {
return input;
}
}
请注意,这种方法不是很可靠(如果原始对象很深,则在内存方面也很昂贵)。