这个函数我传入一个数组提示arr.map不是函数?
const setArr = (arr) => {
arr.map((m) => {
m.title = m.meta.title
if (m.children.length) {
setArr(m)
}
})
return arr
}
这个函数我传入一个数组提示arr.map不是函数?
const setArr = (arr) => {
arr.map((m) => {
m.title = m.meta.title
if (m.children.length) {
setArr(m)
}
})
return arr
}
你的代码中的问题在于你尝试在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.children
为undefined
或null
时发生错误。
请注意,这段代码假设你的输入数据是类似这样的嵌套对象数组:
const data = [
{
meta: {
title: 'Title 1',
},
children: [
{
meta: {
title: 'Title 1.1',
},
children: [],
},
// ... other children
],
},
// ... other elements
];
并且每个对象都有一个meta
属性,该属性包含一个title
属性,以及一个可选的children
属性,该属性是一个对象数组。
最后,这段代码会返回一个新的数组,而不是在原地修改原数组。如果你需要在原地修改原数组,你可以使用for...of
循环代替map
函数。
你这个和 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
}
8 回答4.7k 阅读✓ 已解决
6 回答3.4k 阅读✓ 已解决
5 回答2.8k 阅读✓ 已解决
5 回答6.3k 阅读✓ 已解决
4 回答2.3k 阅读✓ 已解决
4 回答2.8k 阅读✓ 已解决
3 回答2.5k 阅读✓ 已解决