用于展平多维数组的函数[重复]

Posted

技术标签:

【中文标题】用于展平多维数组的函数[重复]【英文标题】:Function for flatten a multi-dimensional array [duplicate] 【发布时间】:2014-08-16 07:55:42 【问题描述】:
var flatten = function (array)
  // TODO: Program me
  var newArray = [];
  for(var i = 0; i<array.length; i++) 
    newArray.push(array[i]);
  
  return newArray;

这是除外的结果:

flatten([1,2,3]) // => [1,2,3]
flatten([[1,2,3],["a","b","c"],[1,2,3]])  // => [1,2,3,"a","b","c",1,2,3]
flatten([[[1,2,3]]]) // => [[1,2,3]]

Test result:

Test Passed

Test Passed

Test Failed: Value is not what was expected
    我在“面向 Web 开发人员的专业 JS”中搜索了一些 heliping 函数,但找不到用于查找数组维数的函数。

【问题讨论】:

这是学习递归的好机会 只检查内部元素是否为数组 This is the answer I was looking at 来自该副本。 我不确定您是如何声称您的第二次测试通过的。除了从一个数组中获取元素并将它们放入另一个数组之外,您的函数实际上并没有做任何事情。没有什么是扁平的。您的输出与输入基本相同。 return [].concat.apply([], array); - 是解决方案。谢谢安迪的话题。 【参考方案1】:

诀窍在于,如果输入数组的元素本身就是数组,那么您应该 "concat" 将元素的展平项放入输入数组,而不是推入整个数组。

这是一个使用“reduce”和“Array.isArray(...)”的解决方案,它们仅在支持 ECMAScript 5.1th 版本的较新规范的较新浏览器中可用:

function flatten(array) 
  return array.reduce(function(memo, el) 
    var items = Array.isArray(el) ? flatten(el) : [el];
    return memo.concat(items);
  , []);


flatten([1,2,3])                          // => [1,2,3]
flatten([[1,2,3],["a","b","c"],[1,2,3]])  // => [1,2,3,"a","b","c",1,2,3]
flatten([[[1,2,3]]])                      // => [1, 2, 3]

【讨论】:

您应该注意,此代码仅适用于支持Array.prototype.reduceArray.isArray 的最新浏览器。否则,必须应用 polyfill。 @VisioN:确实,我非常依赖方便、更新的语言功能 =)【参考方案2】:

这是使用递归的一种可能解决方案:

function flatten(array, result) 
    result === undefined && (result = []);

    for (var i = 0, len = array.length; i < len; i++) 
        if (Object.prototype.toString.call(array[i]) === '[object Array]') 
            flatten(array[i], result);
         else 
            result.push(array[i]);
        
    

    return result;


flatten([1,2,3]);
// [1, 2, 3]

flatten([[1,2,3], ["a","b","c"], [1,2,3]]);
// [1, 2, 3, "a", "b", "c", 1, 2, 3]

flatten([[[1,2,3]]]);
// [1, 2, 3]

演示: http://jsfiddle.net/6ZhJ6/

【讨论】:

如果您查看预期结果#3,其意图实际上并不是完全展平阵列,而只是一层。 [[[1,2,3]]] 变为 [[1,2,3]] 而不是 [1,2,3] @JamesMontagne 不是expected 而是excepted,这可能意味着OP 从他的代码中收到的真实结果,因此最后一个“测试失败”。跨度> 哈,我按预期读到了,尽管我仍然认为这是预期的结果,因为原始代码实际返回的结果只是传递的内容的副本。该函数基本上什么都不做。 @JamesMontagne 是的,我知道这很令人困惑,但我刚刚提出了另一个解决方案(除了相关问题中的解决方案),这似乎正在做 预期 :)

以上是关于用于展平多维数组的函数[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Javascript中的深平面多维数组[重复]

Perl:展平多维数组的最简单方法是啥?

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

部分展平多维数组

php中的二维多维数组到一维数组[重复]

在 PHP 中将多维关联数组展平为一维引用数组