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/usereduce
。如果需要强制迭代,请使用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;
}