【问题标题】:Javascript : do a second treatment when array filtering is completeJavascript:数组过滤完成后进行第二次处理
【发布时间】:2020-06-11 10:12:57
【问题描述】:

我必须使用两种方法来操作一个数组,一个接一个:

  1. 过滤器数组
  2. 然后,排序

我的过滤方法如下

  filterArray(list){
    return list.filter(item=> !this.myCondition(item));
  }

我的排序方法如下:

sortArray(list) {
    return list.sort((a, b) =>
      new Date(b.beginDate).getTime() - new Date(a.beginDate).getTime()
    );
}

我想控制它,顺便说一下,它完成过滤然后进行排序

我试过了:

myData = myData.filterArray(myData).sortArray(myData);

但我不确定这是最干净的方式 (注意:我想保持排序和过滤方法分开)

最好的方法?

【问题讨论】:

  • 没关系。顺便说一句,你的日期是什么格式的?
  • 你不能在sortArray 中使用this 而不是将myData 作为参数传递吗?

标签: javascript angular typescript ecmascript-6 rxjs


【解决方案1】:
  myData = myData
  .filter(item => !this.myCondition(item))
  .sort((a, b) => new Date(b.beginDate).getTime() - new Date(a.beginDate).getTime());

每一行都分配了不同的工作。

【讨论】:

    【解决方案2】:

    Array.sort 不会 返回 排序的数组。它将就地排序,这意味着它将变异 数组。因此从你的排序函数返回一些东西并存储它是没有意义的。如果你想防止原始数组的突变,你应该在你的排序函数上手动克隆它,然后对其进行排序,然后返回。保持纯函数没有副作用;

    sortArray(list) {
        let listClone = list.slice(0); // some fast cloning method
        listClone.sort((a, b) =>
          new Date(b.beginDate).getTime() - new Date(a.beginDate).getTime()
        );
        return listClone 
    }
    

    由于过滤器每次都返回新数组,因此您的代码可以正常工作;但是如果你单独使用你的排序功能,它会产生副作用。

    【讨论】:

      猜你喜欢
      • 2021-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多