javascript - JS函数在大于或小于之间切换

标签 javascript

我有一个相当长的函数,目前我需要该函数的副本,唯一的区别是它要求大于而不是小于。所以唯一的区别是 > 或 <。

是否有任何(非困惑)方法可以使这种函数只是一个函数而不是这里的两个函数?

function(value, modifier) {
 let result;
 if (value > modifier) result = 10;
 return result;
}

function(value, modifier) {
 let result;
 if (value < modifier) result = 10;
 return result;
}

所以基本上我需要一个条件大于/小于号。

编辑:要明确的是,在理想的世界中我想这样做:

myFunction(10, 5, >)

编辑:添加我的实际功能的一部分以使事情更清晰。我希望可能有真正简单的方法来做到这一点,但看起来也许不是,所以也许实际功能的一部分可能会有所帮助:

function getEdges(colour) {
    for (let x = 0; x < width; x++) {
        for (let y = height - 1; y >= 0; y--) {
            const data = getData(x,y);
            if (data[0] < colour) {
                edge.push(y);
                break;
            }
        }
    }
    return edge;
    }

还有另一个与此几乎相同的函数,唯一的区别是行 if (data[0] > color) { 大于而不是小于。

最佳答案

如果两个函数之间的唯一区别是比较,那么您可以提取它并将其作为参数

function getEdges(colour, comparator) {
  for (let x = 0; x < width; x++) {
    for (let y = height - 1; y >= 0; y--) {
      const data = getData();
      if (comparator(data[0], colour)) {
        edge.push(y);
        break;
      }
    }
  }
  return edge;
}

//call with less than
getEdges(someColour, (a, b) => a < b)
//call with greater than
getEdges(someColour, (a, b) => a > b)

您还可以将逻辑保留在一个函数中,并从中派生出另外两个函数。这样您就不需要维护多个代码块,并且仍然会得到两个显式调用:

使用 .bind 的部分应用:

function getEdges(comparator, colour) {
//                    ^        ^      the two parameters are swapped
  for (let x = 0; x < width; x++) {
    for (let y = height - 1; y >= 0; y--) {
      const data = getData();
      if (comparator(data[0], colour)) {
        edge.push(y);
        break;
      }
    }
  }
  return edge;
}

//partial application
const getEdgesLessThan = getEdges.bind(null, (a, b) => a < b);
const getEdgesGreaterThan = getEdges.bind(null, (a, b) => a > b);

getEdgesLessThan(someColour)
getEdgesGreaterThan(someColour)

使用a curried function :

function getEdges(comparator) {
//                    ^---------
  return function(colour) {//  | taking two parameters
//                  ^ ----------
    for (let x = 0; x < width; x++) {
      for (let y = height - 1; y >= 0; y--) {
        const data = getData();
        if (comparator(data[0], colour)) {
          edge.push(y);
          break;
        }
      }
    }
    return edge;
  }
}

//currying
const getEdgesLessThan = getEdges((a, b) => a < b);
const getEdgesGreaterThan = getEdges((a, b) => a > b);

getEdgesLessThan(someColour)
getEdgesGreaterThan(someColour)

关于javascript - JS函数在大于或小于之间切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56649385/

相关文章:

javascript - jQuery .find() 返回 "div"的值,但不返回 "main"元素的值

Javascript 代码没有错误,但无法运行

javascript - 如何解析 json 并根据值在 HTML 表中显示不同的颜色?

javascript - jQuery , jscrollpane - 防止窗口在到达 div 末尾时滚动

javascript - 在 Angular JS 中创建表,数据不显示

javascript - Angular js 无法识别我的应用程序?

javascript - 使用从java调用javascript,反之亦然?

javascript - 添加多个局部 View ,但第一个 View 缺少表单

javascript - 谷歌面积图 : Need to show data in tooltip

javascript - React map 不会随着状态的变化而重新渲染