减少数组数组并从Javascript数据中删除null

减少数组数组并从Javascript数据中删除null,javascript,arrays,Javascript,Arrays,我很难通过使用Javascript剥离空值和嵌入数组来“压缩”语法结果。 我正在使用Nearley语法检查器,它可以在句子匹配后运行JS函数。不幸的是,完整解析的结果是一系列数组。下面是一个输出示例 [ [ [ [ [ [ [ [ 'climb'], [ [ null, 'to' ] ] ], [ [ null, [ 'alt' ] ]

我很难通过使用Javascript剥离空值和嵌入数组来“压缩”语法结果。 我正在使用Nearley语法检查器,它可以在句子匹配后运行JS函数。不幸的是,完整解析的结果是一系列数组。下面是一个输出示例

[
   [
      [
         [
            [
               [
                  [ [ 'climb'], [ [ null, 'to' ] ] ],
                  [ [ null, [ 'alt' ] ] ],
                  [ 332, [ null, [ 'km' ] ] ]
               ]
            ],
            [ null ]
         ]
      ]
   ]
]
我想删除所有这些
null
值,并可能将所有这些数组“压缩”为以下形式:

[
   [ 'climb', 'to' ],
   [ 'alt', 332, 'km' ]
]

或者类似的东西。我尝试过使用各种
过滤
方法,但没有成功。

您可以使用相同的方法过滤地图,并将所有数组平坦化

const
filter=array=>array.flatMap(v=>array.isArray(v)
?过滤器(v)
:v==null
? []
:v
),
数组=[[[[[gramb'],[[null',to']],[[null,['alt']],[332[null,['km']]],[null]]],,
结果=过滤器(阵列);
控制台日志(结果)
真的吗?。。那么,
['gramp'、'to'、'alt'、'332'km'怎么样?
彼得·塞利格

太好了。某种逻辑分组会更好,但如果不是

const示例=[[[[
[[
[['爬升'],[[null',到']]],
[[null,['alt']]],
[332,[null,['km']]
]],
[零]
]]]];
功能展开(列表、项目){
if(阵列isArray(项目)){
item=item.reduce(平直,[]);
}
返回列表。concat(项目);
}
常量结果=样本
.减少(平放,[])
.filter(elm=>(elm!=null));//非严格平等
//…以跳过未定义值和空值。
log('result:',result)单线解决方案:

1.转换为字符串2.拆分为平面数组3。删除空值

示例:

var-arr=[
[
[
[
[
[
[['gramb'],[[null',至']]],
[[null,['alt']]],
[332,[null,['km']]
]
],
[零]
]
]
]
];
var res=arr.toString().split(“,”).filter(item=>item);
控制台日志(res)
让resArr=[];
常量findLoc=(arr,loc=[])=>{
arr.map((d,i)=>{
if(数组isArray(d)){
findLoc(d,[…loc,i]);
}否则{
如果(d!==null){
//控制台日志(d,loc);
重新定位推送([…定位,d])
}
}
})
}
常数a=[
[
[
[
[
[
[['爬升'],[[null',到']]],
[[null,['alt']]],
[332,[null,['km']],
[56,[null,null,[[8]]]
]
],
[零]
]
]
]
];
findLoc(a);
让finalIndex=[…resArr.reverse()[0]];
finalIndex.拼接(finalIndex.长度-1,1);
finalIndex=resArr[0].indexOf(Math.max(…finalIndex));
常量finalObj={};
重新分配forEach((d)=>{
finalObj[d[finalIndex]=finalObj[d[finalIndex]]?[…finalObj[d[finalIndex]],d[d.length-1]:[d[d.length-1]]
});
log(Object.values(finalObj));

//[to”,“Gramb”],[alt”],[km”,332],[8,56]
alt发生了什么事?为什么不仅仅是sinlge阵列?你试过什么?对不起。忘了“alt”。单阵列也很好,只是提供了一个选项。添加了
alt
输出数组中的
'alt'
不应该在自己的行上吗?当然,不管您想生成什么。如果我可以简化它,我就可以更容易地将它放在JSON结构中,这是我的最终目标<代码>爬升
可以被视为动词,
alt 332 km
可以被视为目标或主体。从目前为止的情况来看,只有
[[['gramb','to'],['alt'],[332',km']
是一般工作方法最合乎逻辑的结果。
[[['爬升',['爬升',['爬升',332,'公里]]
的编辑输出毫无意义。。。。对于OP的简单语法检查,它只处理字符串、数字和空值,这是最优雅的方法。