首页 > 解决方案 > 如何在 lodash 中使用 orderBy 替换空值

问题描述

如何正确地将空值替换为不同的值,例如orderby在 lodash 中使用的字符串。

目前,这就是我用字符串替换空值的方法。我将使用单独的字符串foreach loop替换空值.GroupDate ,然后使用该orderBy函数。

test.forEach((e, i) => {
    if (e.GroupDate === null) {
      test[i].GroupDate = i.toString();
    }
});

test = orderBy(test, [c => c.GroupDate, c => c.Index, c => c.Date], ['desc', 'asc']);

如果有更好的方法来替换 foreach 循环并将此条件添加到orderBy?

我试过这个但它不起作用:

let groupDateNumber = 0;

test = orderBy(test, [
    (c) => {
      if (c.GroupDate === null) {
        c.GroupDate = groupDateNumber.toString();
      }
      groupDateNumber++;
      return c.GroupDate, c => c.Index, c => c.Timestamp;
    }
], ['desc', 'asc']);

标签: javascriptlodash

解决方案


您的 iteratee 函数返回一个数组,对吗?我相信你想要的是

let groupDateNumber = 0;

test = orderBy(test, [
    (c) => {
      if (c.GroupDate === null) {
        c.GroupDate = groupDateNumber.toString();
      }
      groupDateNumber++;
      return c.GroupDate;
    },
    c => c.Index,
    c => c.Timestamp
], ['desc', 'asc']);

另一种方法是通过使用 lodash seq 方法_(value)mapand来做到这一点orderBy。这应该使用惰性评估,因此它应该是有效的,尽管我不确定链接与 orderBy 和 sortBy 的效果如何。

test = _(test)
  .map((e, i) => {
    if (e.GroupDate === null) {
      e.GroupDate = i.toString();
    }
    return e;
  })
  .orderBy([c => c.GroupDate, c => c.Index, c => c.Date], ['desc', 'asc'])
  .value()

推荐阅读