如何从多维数组中仅提取第二层级数组的元素
提取多维数组中第二层级的非数组元素
没问题,我来帮你搞定这个需求!你的核心目标是只取原数组直接包含的子数组里的非数组元素,原代码只是把整个第二层级的数组打印出来,没有过滤掉其中嵌套的更深层数组,所以才会出现不符合预期的结果。
方法一:传统循环实现
这是最直观的写法,步骤清晰:
- 遍历原数组,找到所有直接的子数组(也就是第二层级的容器)
- 遍历每个子数组,只把不是数组的元素收集到结果数组中
var myArr = [1, 2, 3, [10, 11,[1321,3213,[321321, true], "ha"], 133], 4, 5]; var mySecondArr = []; for (let i = 0; i < myArr.length; i++) { // 用Array.isArray判断是否为数组,比typeof更准确(typeof数组会返回'object') if (Array.isArray(myArr[i])) { // 遍历第二层级数组的每个元素 for (let j = 0; j < myArr[i].length; j++) { // 只收集非数组元素,排除深层嵌套的数组 if (!Array.isArray(myArr[i][j])) { mySecondArr.push(myArr[i][j]); } } } } console.log(mySecondArr); // 输出: [10, 11, 133]
方法二:数组API简化实现
如果喜欢更简洁的写法,可以用reduce结合filter来完成,逻辑和上面一致,但代码更紧凑:
var myArr = [1, 2, 3, [10, 11,[1321,3213,[321321, true], "ha"], 133], 4, 5]; var mySecondArr = myArr.reduce((result, currentItem) => { // 遇到直接子数组时,过滤出其中的非数组元素,添加到结果里 if (Array.isArray(currentItem)) { result.push(...currentItem.filter(item => !Array.isArray(item))); } return result; }, []); console.log(mySecondArr); // 输出: [10, 11, 133]
关键注意点
- 不要用
typeof判断数组:typeof []会返回'object',无法区分数组和普通对象,Array.isArray()是专门判断数组的可靠方法。 - 明确层级:我们只处理原数组的直接子数组,对于子数组里的嵌套数组直接跳过,只保留其中的基础类型元素(数字、字符串、布尔值等)。
内容的提问来源于stack exchange,提问作者Radu Orza
相关产品推荐
相关产品推荐

