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

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


[

   [

      [

         [

            [

               [

                  [ [ 'climb'], [ [ null, 'to' ] ] ],

                  [ [ null, [ 'alt' ] ] ],

                  [ 332, [ null, [ 'km' ] ] ]

               ]

            ],

            [ null ]

         ]

      ]

   ]

]

我想删除所有这些null值,并可能将所有这些数组“压缩”为以下形式:


[

   [ 'climb', 'to' ],

   [ 'alt', 332, 'km' ]

]

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


一只斗牛犬
浏览 102回答 4
4回答

慕侠2389804

您可以使用相同的方法过滤地图并平坦所有数组。const    filter = array => array.flatMap(v => Array.isArray(v)        ? filter(v)        : v === null            ? []            : v    ),    array = [[[[[[[['climb'], [[null, 'to']]], [[null, ['alt']]], [332, [null, ['km']]]]], [null]]]]],    result = filter(array);console.log(result);更短的方法const    filter = array => array        .flat(Infinity)        .filter(v => v !== null),    array = [[[[[[[['climb'], [[null, 'to']]], [[null, ['alt']]], [332, [null, ['km']]]]], [null]]]]],    result = filter(array);console.log(result);

慕桂英4014372

真的吗?...那怎么样['climb', 'to', 'alt', 332, 'km']?– 彼得·塞利格那好极了。某种逻辑分组会更好,但嘿,如果没有的话.........const sample = [[[[  [[    [ [ 'climb'], [ [ null, 'to' ] ] ],    [ [ null, [ 'alt' ] ] ],    [ 332, [ null, [ 'km' ] ] ]  ]],  [ null ]]]]];function flatOut(list, item) {  if (Array.isArray(item)) {    item = item.reduce(flatOut, []);  }  return list.concat(item);}const result = sample  .reduce(flatOut, [])  .filter(elm => (elm != null)); // non strict equality  //...in order to skip both values, undefined and null.console.log('result :', result);

翻过高山走不出你

一条线解决方案:1.转换为字符串 2.拆分为平面数组 3.删除空值例子:var arr = [    [        [            [                [                    [                        [['climb'], [[null, 'to']]],                        [[null, ['alt']]],                        [332, [null, ['km']]]                    ]                ],                [null]            ]        ]    ]];var res = arr.toString().split(",").filter(item => item);console.log(res);

慕运维8079593

let resArr = [];  const findLoc = (arr, loc = []) => {    arr.map((d, i) => {      if (Array.isArray(d)) {        findLoc(d, [ ...loc, i ]);      } else {        if (d !== null) {          // console.log(d, loc);          resArr.push([...loc, d])        }      }    })}  const a = [     [        [           [              [                 [                    [ [ 'climb'], [ [ null, 'to' ] ] ],                    [ [ null, [ 'alt' ] ] ],                    [ 332, [ null, [ 'km' ] ] ],                    [ 56, [ null, null, [ [ [8] ] ] ] ]                 ]              ],              [ null ]           ]        ]     ]  ];  findLoc(a);  let finalIndex = [...resArr.reverse()[0]];  finalIndex.splice(finalIndex.length -1 , 1);  finalIndex = resArr[0].indexOf(Math.max(...finalIndex));  const finalObj = {};  resArr.forEach((d) => {    finalObj[d[finalIndex]] = finalObj[d[finalIndex]] ? [...finalObj[d[finalIndex]], d[d.length -1]] : [d[d.length -1]]  });  console.log(Object.values(finalObj));    // [ [ "to", "climb" ], [ "alt" ], [ "km", 332 ], [ 8, 56 ] ]改变输入并测试,使用矩阵逻辑我们可以激活它
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript