首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >javascript对象多维数组一维数组

javascript对象多维数组一维数组
EN

Stack Overflow用户
提问于 2020-02-07 10:12:09
回答 2查看 62关注 0票数 1

我有这样的变量rawData

代码语言:javascript
复制
let rawData = [
  {
    title: '1',
    result: '1',
    child: [
      {
        title: '1-1',
        result: '1-1',
        child: [
          {
            title: '1-1-1',
            result: '1-1-1',
            child: [
              {
                title: '1-1-1-1',
                result: '1-1-1-1',
                child: [
                  {
                    title: '1-1-1-1-1',
                    result: '1-1-1-1-1',
                  },
                ],
              },
              {
                title: '1-1-1-2',
                result: '1-1-1-2',
              },
              {
                title: '1-1-1-3',
                result: '1-1-1-3',
              },
            ],
          },
        ],
      },
    ],
  },
];

还有我的功用。它按预期运行,下面是我的函数:

代码语言:javascript
复制
let normalizeArray = [];
function test(array) {
  for (const key in array) {
    if (array.hasOwnProperty(key)) {
      const element = array[key];
      if (element.hasOwnProperty('child')) {
        test(element.child);
        delete element.child;
        normalizeArray.unshift(Object.assign({}, element));
      } else {
        normalizeArray.push(Object.assign({}, element));
      }
    }
  }
}

和返回(预期):

代码语言:javascript
复制
[
  { title: '1', result: '1' },
  { title: '1-1', result: '1-1' },
  { title: '1-1-1', result: '1-1-1' },
  { title: '1-1-1-1', result: '1-1-1-1' },
  { title: '1-1-1-1-1', result: '1-1-1-1-1' },
  { title: '1-1-1-2', result: '1-1-1-2' },
  { title: '1-1-1-3', result: '1-1-1-3' },
];

但是,如果rawData是这样的:

代码语言:javascript
复制
let rawData = [
  {
    title: '1',
    result: '1',
    child: [
      {
        title: '1-1',
        result: '1-1',
        child: [
          {
            title: '1-1-1',
            result: '1-1-1',
            child: [
              {
                title: '1-1-1-1',
                result: '1-1-1-1',
                child: [
                  {
                    title: '1-1-1-1-1',
                    result: '1-1-1-1-1',
                  },
                ],
              },
              {
                title: '1-1-1-2',
                result: '1-1-1-2',
              },
              {
                title: '1-1-1-3',
                result: '1-1-1-3',
              },
            ],
          },
        ],
      },
    ],
  },
  {
    title: '2',
    result: '2',
    child: [
      {
        title: '2-2',
        result: '2-2',
      },
    ],
  },
  {
    title: '3',
    result: '3',
  },
];

在我的功能中,它返回:

代码语言:javascript
复制
[
  { title: '2', result: '2' },
  { title: '1', result: '1' },
  { title: '1-1', result: '1-1' },
  { title: '1-1-1', result: '1-1-1' },
  { title: '1-1-1-1', result: '1-1-1-1' },
  { title: '1-1-1-1-1', result: '1-1-1-1-1' },
  { title: '1-1-1-2', result: '1-1-1-2' },
  { title: '1-1-1-3', result: '1-1-1-3' },
  { title: '2-2', result: '2-2' },
  { title: '3', result: '3' },
];

我怎么能得到这样的结果:

代码语言:javascript
复制
[
  { title: '1', result: '1' },
  { title: '1-1', result: '1-1' },
  { title: '1-1-1', result: '1-1-1' },
  { title: '1-1-1-1', result: '1-1-1-1' },
  { title: '1-1-1-1-1', result: '1-1-1-1-1' },
  { title: '1-1-1-2', result: '1-1-1-2' },
  { title: '1-1-1-3', result: '1-1-1-3' },
  { title: '2', result: '2' },
  { title: '2-2', result: '2-2' },
  { title: '3', result: '3' },
];

如果你能帮我生成更精简的代码,请随时帮助我。我在javascript上还是新手

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-02-07 10:16:51

它可以用扩展算子和递归来获得清晰的外观。

代码语言:javascript
复制
function flatten(dataArray) {
  const result = [];
   dataArray.map(d => {
    const { child, ...rest } = d;
    result.push(rest);
    if(child && child.length) result.push(...flatten(child));
  });
   return result;
}
console.log(flatten(rawData));

希望它能帮上忙

票数 0
EN

Stack Overflow用户

发布于 2020-02-07 10:22:22

与删除/移位/取消移位不同,您可以立即通过析构从数组项中提取属性。将titleresult作为对象推送到结果数组,如果存在child,则执行递归调用。这样,结果数组将是普通深度优先策略的输出:

代码语言:javascript
复制
function doFlat(inputArr, resultsArr = []) {
  for (const { child, title, result } of inputArr) {
    resultsArr.push({ title, result });
    if (child) {
      doFlat(child, resultsArr);
    }
  }
  return resultsArr;
}

通过将结果数组作为传递给每个递归调用的默认参数,您只能创建一个数组,这比为每个函数调用创建一个新数组更有效,然后在调用者中迭代它。

代码语言:javascript
复制
function doFlat(inputArr, resultsArr = []) {
  for (const { child, title, result } of inputArr) {
    resultsArr.push({ title, result });
    if (child) {
      doFlat(child, resultsArr);
    }
  }
  return resultsArr;
}

let rawData = [
  {
    title: '1',
    result: '1',
    child: [
      {
        title: '1-1',
        result: '1-1',
        child: [
          {
            title: '1-1-1',
            result: '1-1-1',
            child: [
              {
                title: '1-1-1-1',
                result: '1-1-1-1',
                child: [
                  {
                    title: '1-1-1-1-1',
                    result: '1-1-1-1-1',
                  },
                ],
              },
              {
                title: '1-1-1-2',
                result: '1-1-1-2',
              },
              {
                title: '1-1-1-3',
                result: '1-1-1-3',
              },
            ],
          },
        ],
      },
    ],
  },
  {
    title: '2',
    result: '2',
    child: [
      {
        title: '2-2',
        result: '2-2',
      },
    ],
  },
  {
    title: '3-3',
    result: '3-3',
  },
];

console.log(doFlat(rawData));

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60111290

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档