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

Posted

技术标签:

【中文标题】Javascript中的深平面多维数组[重复]【英文标题】:Deep flat multidimensional array in Javascript [duplicate] 【发布时间】:2017-12-26 09:29:44 【问题描述】:

我想编写一个可以深度展平给定数组的函数。例如:

deepFlatten([]);         // []
deepFlatten([1, 2, 3]);  // [1, 2, 3] 
deepFlatten([[1, 2, 3], ["a", "b", "c"], [1, 2, 3]]); // [1, 2, 3, "a", "b", "c", 1, 2, 3]
deepFlatten([[3], [4], [5]], [9], [9], [8], [[1, 2, 3]]]);  // [3, 4, 5, 9, 9, 8, 1, 2, 3]

我尝试递归地解决这个问题,到目前为止我已经得到了这个:

var deepFlatten = function (array)
  var result = []; 
  array.forEach(function (elem) 
    if (Array.isArray(elem)) 
        result.concat(deepFlatten(elem)); // problem probably lies here
     else 
        result.push(elem);
    
  );
  return result;
;

然而,这只会将非数组元素推送到结果并完全忽略连接部分。我该如何解决这个问题,或者有没有更好的方法来编写这个函数而不需要任何外部库的帮助?

【问题讨论】:

【参考方案1】:

您只需将结果设置为result = result.concat(deepFlatten(elem))

var deepFlatten = function (array)
  var result = []; 
  
  array.forEach(function (elem) 
    if (Array.isArray(elem)) 
        result = result.concat(deepFlatten(elem)); // Fix here
     else 
        result.push(elem);
    
  );
  
  return result;
;

console.log(deepFlatten([]))     
console.log(deepFlatten([1, 2, 3]))
console.log(deepFlatten([[1, 2, 3], ["a", "b", "c"], [1, 2, 3]]))
console.log(deepFlatten([[[3], [4], [5]], [9], [9], [8], [[1, 2, 3]]]))

相反,您可以使用 reduce() 并传播语法而不是 concat。

var deepFlatten = function (array)
  return array.reduce(function(r, e) 
    return Array.isArray(e) ? r.push(...deepFlatten(e)) : r.push(e), r
  , [])
;

console.log(deepFlatten([]))     
console.log(deepFlatten([1, 2, 3]))
console.log(deepFlatten([[1, 2, 3], ["a", "b", "c"], [1, 2, 3]]))
console.log(deepFlatten([[[3], [4], [5]], [9], [9], [8], [[1, 2, 3]]]))

【讨论】:

【参考方案2】:

您的代码基本没问题。 .concat 返回一个新数组,它不会修改原始数组。如果你改变了

result.concat(deepFlatten(elem)); // problem probably lies here

到:

result = result.concat(deepFlatten(elem)); // problem probably lies here

我认为它给出了正确的结果。

【讨论】:

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

对多维数组javascript中的所有整数求和

使用 Javascript 检查多维数组的长度 [重复]

javascript创建多维数组语法[重复]

array_uintersect 将多维数组的每一行中的特定元素与字符串的平面数组进行比较

将平面数组转换为分层的多维数组

如何将平面数组排序为多维树