如何在javascript中跳过数组为空

时间:2017-09-23 18:40:48

标签: javascript arrays json concat

我从json url到json_decode创建一个数组。我用各种嵌套数组做一些事情。我还想用来自所有嵌套数组的数据做一些事情。因此我认为将数组再次连接成一个(但现在没有嵌套)并循环遍历它会很方便。 concat工作完美。但是当我尝试在键/值上对新数组进行排序时,它会出错并且我知道原因。一个或多个有时为空的数组(动态数据源)。因此,数组是例如;

"various":null

这就是我为脚本创建各种变量的方法。

var data_hazards = data_all['alerts'][0]['hazards'];
var data_various = data_all['alerts'][0]['various'];
var data_standstill = data_all['alerts'][0]['standstill'];
var data_roadclosed = data_all['alerts'][0]['roadclosed'];
var data_accidents = data_all['alerts'][0]['accidents'];
var data_police = data_all['alerts'][0]['police'];
var data_construction = data_all['alerts'][0]['constructions'];
var data_jams = data_all['alerts'][0]['jams'];
//Concat the above arrays
var data_total = data_hazards.concat(data_various).concat(data_standstill).concat(data_roadclosed).concat(data_accidents).concat(data_police).concat(data_construction).concat(data_jams);

现在我想知道如何在空的时候跳过concat()中的数组。

有人有想法吗?

很高兴收到你的来信。

此致

路德

2 个答案:

答案 0 :(得分:1)

您可以使用默认的空数组来连接所有数组。您不需要链接Array.concat,因为您可以使用更多数组作为参数。

var data_total = [].concat(
        data_hazards || [],
        data_various || [],
        data_standstill || [],
        data_roadclosed || [],
        data_accidents || [],
        data_police || [],
        data_construction || [],
        data_jams || []
    );

另一个解决方案可能是带有值的数组。

var data_total = [
        data_hazards, data_various, data_standstill, data_roadclosed, data_accidents, data_police, data_construction, data_jams
    ].reduce((r, a) => r.concat(a || []), []);

使用默认数组测试空数组或虚数值的情况:



// concat empty array to an empty array
console.log([].concat([]));         // []

// use default array if falsy value
console.log([].concat(null || [])); // []

// concat a value to an empty array
console.log([].concat(['foo']));    // ['foo']




答案 1 :(得分:0)

您的代码中存在明显的重复模式,因此存在大量重复。我建议以下内容来解决这个问题并同时解决您的问题:

const data_total =
  ['hazards', 'various', 'standstill', ...]
    .map(key => data_all['alerts'][0][key]) // retrieve data for each key
    .filter(data => data != null) // ignore those that are null
    .reduce((a, b) => a.concat(b), []); // concat them all together