使用嵌套数组数组重命名深度嵌套对象中的所有数组

时间:2019-01-15 03:06:16

标签: javascript arrays recursion

我正在构建一个递归“按摩”功能,该功能需要重命名某些属性键。我一直在尝试一些递归方法,但到目前为止没有用。

例如,我需要从此深度嵌套对象内的所有数组中删除单词“ Array”。

样本输入:

var input = {
  test: {
    testArray1: [
      {
        testArray2: [
          {
            sample: {
              testArray3: [],
            },
          },
        ],
      },
    ],
  },
};

预期输出:

var output = {
  test: {
    test1: [
      {
        test2: [
          {
            sample: {
              test3: [],
            },
          },
        ],
      },
    ],
  },
};

2 个答案:

答案 0 :(得分:4)

最好的方法(无递归)可以是将JSON转换为stringJSON.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;
  }

}

请注意,这种方法不是很可靠(如果原始对象很深,则在内存方面也很昂贵)。