用于展平多维数组的函数[重复]
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.reduce
和Array.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 是的,我知道这很令人困惑,但我刚刚提出了另一个解决方案(除了相关问题中的解决方案),这似乎正在做 预期 :)以上是关于用于展平多维数组的函数[重复]的主要内容,如果未能解决你的问题,请参考以下文章