javascript - 递归地展平深度嵌套的对象和数组的组合

标签 javascript recursion javascript-objects flatten

我正在尝试展平包含混合内容(React 应用程序中的 JavaScript)的数据对象。我只需要对象中每个父级和子级的键;我不一定需要这些值(尽管存在它们不会破坏交易)。

我已经搜索了一个多星期来找到适合我的用例的解决方案,但我尝试过的所有方法都达不到要求,包括普通 JavaScript、Lodash、Underscore 和 flat(NPM 包)。

在每种情况下,我要么得到比我预期的更短的列表(因为我只得到 parent ),要么得到一个带有点符号分隔对象的完全展平的对象,这对我来说毫无用处。

我知道有很多与该主题相关的问题和答案,但我所看到的没有任何内容与我的用例相符,而且我似乎无法解决这个问题。

这是我的数据结构示例:

const sampleData = {
  coyotes: '',
  armadillos: false,
  wombats: [''],
  geckos: 0,
  dogs: {
    beagle: '',
    bulldog: ''
  },
  wolves: [
    {
      type: '',
      color: '',
      range: '',
      status: {
        endangered: true,
        protected: false
      }
    }
  ],
  cats: {}
}

这是我(理想情况下)想要回来的:

result = {coyotes, armadillos, wombats, geckos, dogs, beagle, bulldog, wolves, type, color, range, status, endangered, protected, cats}

这是我调用展平方法的方式:

flattenData(sampleData)

这是我到目前为止所拥有的:

const flattenData = (obj) =>
      Object.assign(
        {},
        ...(function _flatten (o) {
          return [].concat(...Object.keys(o)
            .map(k =>
              typeof o[k] === 'object' ? _flatten(o[k]) : (Number([k]) !== 0 && { [k]: o[k] })
            )
          )
        }(obj))
      )

...产生:

{
    "coyotes": "",
    "armadillos": false,
    "geckos": 0,
    "beagle": "",
    "bulldog": "",
    "type": "",
    "color": "",
    "range": "",
    "endangered": true,
    "protected": false
}

正如您所注意到的,一些 parent 缺失了(袋熊、狗、狼和地位),并且缺失了一个空物体(猫)。

最佳答案

这不是我写过的最漂亮的代码。不幸的是它确实得到了一切

const flattenData = (data) => {
  let results = [];
  const recursive = (data) => {
    Object.keys(data)
      .map(function (key) {
        results.push(key);
        recursive(data[key]);
        return data[key]; // This doesn't actually do anything...
      });
  }
  recursive(data);
  return results;
};

const value = flattenData(sampleData);

关于javascript - 递归地展平深度嵌套的对象和数组的组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70713850/

相关文章:

javascript - 如何从递归中的 Promise 获取值

c - 递归函数如何返回 33?

c++ - 在 AST 中解析节点和它们自己的(无限数量的嵌套)子节点

javascript - 如何在 ASP.Net 中为用户控件添加 Javascript 对象

javascript - 将多个对象插入单个对象

javascript - How does it snow on Google,输入 Let it snow

javascript - 在 Ruby on Rails 中,如何自动更新并显示 View 中的变量?

javascript:循环遍历元素并更改它们的值

javascript - 火车图表项目删除错误

Javascript 对象相互交叉引用