Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/454.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript中嵌套数组的扁平化_Javascript_Arrays - Fatal编程技术网

JavaScript中嵌套数组的扁平化

JavaScript中嵌套数组的扁平化,javascript,arrays,Javascript,Arrays,我有一个可怕的数组,看起来像这样: flattenedArray = [a,b,c,1,2,3,d,e,f,g,h,4,5,6,7] 编辑: 并希望阵列如下所示: flattenedArray = [a,b,c,1,2,3,d,e,f,g,h,4,5,6,7] 不幸的是,我无法更改原始格式,因为这是合并两个API响应时收到的表单 我试过使用: var flattenedArray = [].concat.apply([], array); 但它只是以输入的相同格式显示数组 我想知道有没有人

我有一个可怕的数组,看起来像这样:

flattenedArray = [a,b,c,1,2,3,d,e,f,g,h,4,5,6,7]
编辑:

并希望阵列如下所示:

flattenedArray = [a,b,c,1,2,3,d,e,f,g,h,4,5,6,7]
不幸的是,我无法更改原始格式,因为这是合并两个API响应时收到的表单

我试过使用:

var flattenedArray = [].concat.apply([], array);
但它只是以输入的相同格式显示数组

我想知道有没有人有什么建议

编辑: 我已经尝试实施了给出的建议-非常感谢您的帮助。似乎列表的格式有问题-不幸的是,使用chrome控制台,它是“树”格式,我看不到数组输出的直接结构

谢谢你的帮助!
编辑2:实际数组见上面,谢谢你告诉我如何看到这个

如果您有
lodash
,您可以使用:

_.flattenDeep(array)

如果愿意,您还可以检查IDE,了解如何实现自己。

您的数组格式不正确,缺少了
逗号(,)
。这是正确的数组

var数组=[[['a'、'b'、'c']、[1,2,3]、[]、[[[d'、'e'、'f'、'g'、'h']、[4,5,6,7]]

var数组=[[['a'、'b'、'c']、[1,2,3]、[]、[[[d'、'e'、'f'、'g'、'h']、[4,5,6,7]];
var结果=展平(阵列);
函数展平(数组){
var平坦=[];
if(数组!==未定义){
var平坦=[];
for(var i=0;i控制台日志(结果)
您可以使用将返回新数组的
forEach()
创建递归函数

var数组=[[['a'、'b'、'c']、[1,2,3]、[]、[[[d'、'e'、'f'、'g'、'h']、[4,5,6,7]]
功能平面(数据){
var r=[]
data.forEach(e=>Array.isArray(e)?r=r.concat(flat(e)):r.push(e));
返回r;
}
log(平面(数组))
您可以在中尝试该函数


在这种情况下使用递归函数很好:

arr=[[['a'、'b'、'c']、[1,2,3]、[]、[[d'、'e'、'f'、'g'、'h']、[4,5,6,7];
函数展平(arr){
var结果=[];
对于(变量i=0,len=arr.length;i控制台日志(展平(arr))编辑对于嵌套数组/对象的新请求和展开,您可以使用一种结合测试元素类型的方法

var数组=[{字母:[{字母:'A'},{字母:'B'},{字母:'C'}],数字:[{数字:'1'},{数字:'2'},{数字:'3'}]},空,{字母:[{字母:'D'},{字母:'E'},{字母:'F'},{字母:'G'},{字母:'H'},数字:[{数字:'4'},{数字:'5'},{数字:'6'},{,
结果=数组.reduce(函数iter(r,a){
如果(a==null){
返回r;
}
if(数组isArray(a)){
返回a.reduce(iter,r);
}
如果(a的类型===‘对象’){
返回Object.keys(a).map(k=>a[k]).reduce(iter,r);
}
返回r.concat(a);
}, []);
控制台日志(结果)

.as控制台包装{max height:100%!important;top:0;}
没有人想到拼接到位

function flatten(array){
    for (var i = 0; i < array.length; i++) {
        if(array[i] instanceof Array){
            array.splice.apply(array,[i,1].concat(array[i]));
            i--;
        }
    };
    return array;
}
函数展平(数组){
对于(var i=0;i

一次迭代,没有递归。

我相信这段代码只会使一个层次变平;对于更深入的扁平化,您需要递归地运行它。或者像我建议的那样使用lodash;)<代码>&&r
将破坏可读性。我相信很多人不会明白它的目的。我建议将代码分成两行,并使用
returnr
insteads/can/should/use
reduce
。如果需要强制迭代,请使用
for…of
循环,而不是带有箭头函数的
forEach
。顺便说一句,在
concat
的情况下,您不需要重新分配
r
。最好使用
(r,e)=>r.concat(Array.isArray(e)?flat(e):[e])
作为减速机。@Bergi哇,这太好了,为什么
上的括号:[e]
数据呢。reduce((r,e)=>r.concat(Array.isArray(e)?flat(e):e),[])
?因为只有数组应该传递给
concat
。普通值也可以工作,但是concat总是要检查它们是否像数组一样可扩展(因为ES6也不再完全相同),这不是完全有效的JS数组语法。这只是你问题中的一个误传,还是你收到的字符串实际上与此一模一样?我不确定字符串到底是什么样子,这是我从chrome上的开发者工具中理解它的方式。我不知道如何阻止它以树的形式呈现信息,但它看起来更像:然后请向我们展示
console.log(JSON.stringify(array))
生成的输出。获取树状视图表明您没有普通的字符串哦,实际上这不仅仅是一个嵌套数组,而是一个嵌套的对象数组。这使所有答案无效:-(@jess,现在你必须处理对象和数组。你想用
null
做什么?刚刚测试过,它很有魅力-谢谢你花时间来帮助!
function steamrollArray(arr) {
  var tmp = [];
  arr.forEach(function(val){
    if(Array.isArray(val))
      tmp = tmp.concat(steamrollArray(val));
    else
      tmp.push(val);
  });

  console.log(tmp);
  return tmp;
}

steamrollArray([1, [2], [3, [[4]]]]);
function flatten(array){
    for (var i = 0; i < array.length; i++) {
        if(array[i] instanceof Array){
            array.splice.apply(array,[i,1].concat(array[i]));
            i--;
        }
    };
    return array;
}