【问题标题】:Javascript/lodash how to remove empty arraysJavascript/lodash 如何删除空数组
【发布时间】:2017-06-17 08:59:27
【问题描述】:

我正在使用这种结构:

[
   [
      {
         "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 格式使用的输入。可以看到有多个空数组。

我将如何过滤这些数组并删除空数组?

【问题讨论】:

  • "This structure":对于单个结构,这不是有效的 JavaScript 表示法。你能用 JavaScript 表示法提供输入和所需的输出吗?
  • 我已经添加了输入
  • 提供的答案将完成这项工作。您声称他们返回一个空数组的说法很奇怪。如果那真的是 JSON(即文本格式),那么你当然首先需要将它解析成一个真正的数组。

标签: javascript lodash


【解决方案1】:

使用原生的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>

【讨论】:

    【解决方案2】:

    如果顶级数组中的所有项目都是数组,那么您可以使用 isEmpty 谓词来 lodash 的 reject

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

    isEmpty 也将为空对象返回 true,因此如果您的顶级数组可以包含此类项目,那么只需删除空数组,您可以编写一个新函数来仅返回空数组并将其用作谓词拒绝:

    let isEmptyArray = item => _.isArray(item) && _.isEmpty(item);
    
    let result = _.reject(data, isEmptyArray);
    

    【讨论】:

      【解决方案3】:

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

      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);

      【讨论】:

      • 这将返回一个空数组作为结果。
      • 你可以使用解构来缩短它一点filter(({ length }) => length)
      • @JoeBerthelot — 它不在答案中嵌入的现场演示中。由于您未能在问题中提供minimal reproducible example,因此我不得不自己构建输入。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-11
      • 2021-05-13
      相关资源
      最近更新 更多