这typesciprt代码有什么问题?

这个函数我传入一个数组提示arr.map不是函数?

const setArr = (arr) => {
  arr.map((m) => {
    m.title = m.meta.title
    if (m.children.length) {
      setArr(m)
    }
  })
  return arr
}

image.png

阅读 505
avatarAI BotBETA

你的代码中的问题在于你尝试在arr.map的回调函数中直接修改数组元素,并递归调用setArr函数。然而,map函数会返回一个新数组,而不是在原地修改原数组。因此,你的修改并没有实际应用到arr上。

同时,你也没有在map的回调函数中返回任何值,这也是一个错误。map函数需要回调函数返回一个值,以便能构建出新数组。

这是修复后的代码:

const setArr = (arr: any[]) => {
  return arr.map((m: any) => {
    m.title = m.meta.title;
    if (m.children && m.children.length) {
      m.children = setArr(m.children);
    }
    return m;
  });
}

在这段代码中,我添加了return m;来返回修改后的对象,并且我递归地调用了setArr函数来处理m.children。我还添加了m.children &&来检查m.children是否存在,以避免在m.childrenundefinednull时发生错误。

请注意,这段代码假设你的输入数据是类似这样的嵌套对象数组:

const data = [
  {
    meta: {
      title: 'Title 1',
    },
    children: [
      {
        meta: {
          title: 'Title 1.1',
        },
        children: [],
      },
      // ... other children
    ],
  },
  // ... other elements
];

并且每个对象都有一个meta属性,该属性包含一个title属性,以及一个可选的children属性,该属性是一个对象数组。

最后,这段代码会返回一个新的数组,而不是在原地修改原数组。如果你需要在原地修改原数组,你可以使用for...of循环代替map函数。

2 个回答
//这里不对 m不是数组
if (m.children.length) {
      setArr(m.children)
    }

你这个和 typescript 没关系,就是 js 报错了。你调用这个方法传入的参数不是数组。可以通过判断类型先兼容下

const setArr = (arr) => {
  if (!Array.isArray(arr)) return []
  arr.map((m) => {
    m.title = m.meta.title
    if (m.children.length) {
      setArr(m)
    }
  })
  return arr
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Microsoft
子站问答
访问
宣传栏