【问题标题】:Best way to do conditional array methods in javascript在 javascript 中执行条件数组方法的最佳方法
【发布时间】:2017-11-04 20:35:49
【问题描述】:

假设我们有返回数组的函数让我们说 fn(parm1, parm2, parm3) 我想有条件地反转返回的数组。

我知道你可以这样做:

condition ? fn(parm1, parm2, parm3).reverse() : fn(parm1, parm2, parm3)

但就我而言,我不想调用它两次。不是数组,甚至不是调用数组的函数。

所以我的问题是,有什么明显的事情要做,我错过了

array[condition  && .reverse()]

或者第一种方式是调用数组方法的唯一方式。

【问题讨论】:

  • 函数没有被调用两次。你的意思是写两次?
  • 该函数将被调用一次。你的问题不存在;)
  • 为了在条件之前在变量中读取/写入存储数组的简单性
  • 是的,对不起,我的意思当然是写了两次

标签: javascript


【解决方案1】:

您可以使用Array#slice 作为默认方法。

result = fn(parm1, parm2, parm3)[condition ? 'reverse' : 'slice']();

代替slice 并且为了防止获取数组的副本,您可以实现一个函数,该函数只从对象中转换this 而不会改变它。

Array.prototype.nop = function () { return this; };

result = fn(parm1, parm2, parm3)[condition ? 'reverse' : 'nop']();

【讨论】:

  • 为什么要创建一个新数组?
  • @JimmyJanson 如果要求不写两次代码,为什么要创建两次数组?
  • @guest271314 我看不到它在哪里被创建了两次...你是什么意思?
  • @guest271314 我如何创建它两次?不明白。
  • @JimmyJanson Array.prototype.slice() 返回一个新数组
【解决方案2】:
var arr = fn(parm1, parm2, parm3);
condition && arr.reverse();

【讨论】:

  • @NinaScholz reverse 将数组反转到位,因此不需要赋值
  • @NinaScholz “你需要一个reverse的作业” 不明白你的意思? Answer处的代码应该满足要求
  • 这是更好的答案,因为它更高效(并且不那么棘手)。
  • 这有什么不同:var arr = fn(parm1, parm2, parm3);健康)状况 ? arr.reverse() : arr
  • @JimmyJanson 有什么要求?原始问题指出对象是不编写代码两次,但您评论中的代码编写代码两次
【解决方案3】:

保持它易于阅读和理解:

var arr = fn(parm1, parm2, parm3);
if (condition) {
    arr.reverse();
}

以后会阅读您的代码的人不会欣赏棘手的解决方案。

【讨论】:

  • 这与@guest271314 答案有何不同?
  • 正如我上面写的,使用if 关键字可以让代码更容易理解。这当然是个人意见,但我相信大多数人都同意。前面已经讨论过,请在此处阅读:stackoverflow.com/q/34704750/3219919
【解决方案4】:

我有一个数组,我想按 asc 和 desc 排序。排序布尔和三元运算符使我想到了这一点。基本上,如果为假,则乘以 -1。它甚至可以被简化到此之外。

data.items
.sort((a, b) =>
    new Date(a.date) > new Date(b.date)
    ? -1 * (sort ? 1 : -1)
    : 1 * (sort ? 1 : -1)
)

【讨论】:

    【解决方案5】:

    如何使用排序?我不确定浏览器和 node.js 是否在这里有相同的行为:

    const arr = fn(parm1, parm2, parm3).sort(()=> INVERTED ? 1 : 0);
    

    【讨论】:

      猜你喜欢
      • 2010-11-29
      • 2022-06-15
      • 2022-11-07
      • 2011-03-01
      • 1970-01-01
      • 2011-10-05
      • 1970-01-01
      • 2010-11-11
      • 1970-01-01
      相关资源
      最近更新 更多