Javascript函数没有正确展平数组

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Javascript函数没有正确展平数组相关的知识,希望对你有一定的参考价值。

我把一个应该压平嵌套数组的javascript函数放在一起。但是,此方法始终只返回原始数组。例如,使用以下数组运行此函数[1, 2, 3, [4, 5, [6], [ ] ] ]将返回该数组。我知道有一些方法可以通过reduce来实现这一点,但是有什么逻辑上的原因阻止了这种方法的运行? .map应该允许我操作一个返回值并通过递归调用在新数组中返回它。

function mapper(array) { 
    return array.map((item) => {
        return (Array.isArray(item)) ? mapper(item) : item
    } 
)}
答案

什么逻辑原因阻止这种方法工作?

 var m = [1, 2, 3, [4, 5, [6], []]];
 function mapper(array) { 
        return array.map((item) => {
            // for 1,2,3 it will return item
            // when it sees an array it will again call mapper & map
            // function will return a new array from it, so map on 
            // [4, 5, [6], []] will return a new array but will not take out
            // individual element and will put it in previous array

            return (Array.isArray(item)) ? mapper(item) : item
        } 
    )}
mapper(m)

map函数不会改变原始数组,但会返回一个新数组。

另一答案

您正在将数组映射到自身。基本上因为map将返回一个与输入具有完全相同元素数的数组。你不能指望它返回更多,所以你不能用它来扁平化阵列。

应该使用减少代替:

 function flatten(obj) {

     if (Array.isArray(obj)) {
          return obj.reduce((a, b) => a.concat(flatten(b)), []);
     } else {
          return [obj];
     }
 }

以上是关于Javascript函数没有正确展平数组的主要内容,如果未能解决你的问题,请参考以下文章

javascript:尝试仅将数组展平一层

Javascript:使用递归将多维数组展平到位

如何正确连接两个一维数组而不展平?

将带有数组的 json 结构展平为多个没有数组的平面对象

在javascript中展平数组[重复]

展平 javascript 对象数组