Javascript/lodash如何删除空数组

9

我正在使用这个结构:

[
   [
      {
         "comments":"asd",
         "movement":"Back Squat",
         "userID":"wDHZv3OL55SIymHkhMUejNleNkx1",
         "weight":"330"
      }
   ],
   [
      {
         "comments":"asd",
         "movement":"Bench Press",
         "userID":"wDHZv3OL55SIymHkhMUejNleNkx1",
         "weight":"100"
      }
   ],
   [
      {
         "comments":"Comment",
         "movement":"Clean",
         "userID":"wDHZv3OL55SIymHkhMUejNleNkx1",
         "weight":"195"
      }
   ],
   [

   ],
   [

   ],
   [
      {
         "comments":"Front squat comment alpha",
         "movement":"Front Squat",
         "userID":"wDHZv3OL55SIymHkhMUejNleNkx1",
         "weight":"315"
      }
   ],
   [

   ],
   [

   ],
   [

   ],
   [

   ],
   [

   ],
   [
      {
         "comments":"abc",
         "movement":"Strict Press",
         "userID":"wDHZv3OL55SIymHkhMUejNleNkx1",
         "weight":"155"
      }
   ]
]

我正在使用JSON格式的输入。正如您所看到的,有多个空数组。

我该如何筛选这些数组并删除其中的空值?


"这个结构": 这不是单个结构的有效JavaScript表示法。您能否提供输入和所需输出的JavaScript表示法? - trincot
我已经添加了输入。 - Joe Berthelot
1
提供的答案可以完成工作。你声称它们返回一个空数组很奇怪。如果它确实是JSON格式(即文本格式),那么当然首先需要将其解析为真正的数组。 - trincot
3个回答

17

使用原生的Array#filter或lodash的_.filter(),并保留长度不为0的子数组。

Array#filter

var arrs = [[{"comments":"asd","movement":"Back Squat","userID":"wDHZv3OL55SIymHkhMUejNleNkx1","weight":"330"}],[{"comments":"asd","movement":"Bench Press","userID":"wDHZv3OL55SIymHkhMUejNleNkx1","weight":"100"}],[{"comments":"Comment","movement":"Clean","userID":"wDHZv3OL55SIymHkhMUejNleNkx1","weight":"195"}],[],[],[{"comments":"Front squat comment alpha","movement":"Front Squat","userID":"wDHZv3OL55SIymHkhMUejNleNkx1","weight":"315"}],[],[],[],[],[],[{"comments":"abc","movement":"Strict Press","userID":"wDHZv3OL55SIymHkhMUejNleNkx1","weight":"155"}]];

var result = arrs.filter(function(sub) {
  return sub.length;
});

console.log(result);

Lodash的_.filter()结合_.size

var arrs = [[{"comments":"asd","movement":"Back Squat","userID":"wDHZv3OL55SIymHkhMUejNleNkx1","weight":"330"}],[{"comments":"asd","movement":"Bench Press","userID":"wDHZv3OL55SIymHkhMUejNleNkx1","weight":"100"}],[{"comments":"Comment","movement":"Clean","userID":"wDHZv3OL55SIymHkhMUejNleNkx1","weight":"195"}],[],[],[{"comments":"Front squat comment alpha","movement":"Front Squat","userID":"wDHZv3OL55SIymHkhMUejNleNkx1","weight":"315"}],[],[],[],[],[],[{"comments":"abc","movement":"Strict Press","userID":"wDHZv3OL55SIymHkhMUejNleNkx1","weight":"155"}]];

var result = _.filter(arrs, _.size);

console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>


9

如果顶层数组中的所有项都是数组,则可以使用lodash的rejectisEmpty断言函数进行过滤。

let result = _.reject(data, _.isEmpty);

isEmpty还会返回空对象等其他内容,因此如果您的顶级数组可以包含这些项目,则仅删除空数组,您可以组成一个新函数来返回仅空数组,并将其用作拒绝的谓词:

let isEmptyArray = item => _.isArray(item) && _.isEmpty(item);

let result = _.reject(data, isEmptyArray);

1

依次测试每个数组,看它们是否具有非零(真实)长度。如果是,则将其放入新数组中。

var array_of_arrays = [[1], [1,1], [], [], [1]];
var array_of_non_empty_arrays = array_of_arrays.filter((array) => array.length);
console.log(array_of_non_empty_arrays);


这将返回一个空数组作为结果。 - Joe Berthelot
你可以使用解构来使代码更简洁:filter(({ length }) => length) - Ori Drori
@JoeBerthelot — 在答案嵌入的实时演示中没有这个问题。我自己构建了输入,因为你没有在问题中提供 [mcve]。 - Quentin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接