如何在不重复代码的情况下处理 if 块中的不同逻辑?

How to handle different logic in an if block with out duplicating code?

处理执行某些操作但条件不同的 if 块的最佳方法是什么?

假设我在 JavaScript 中有这个功能。

const updateText1 = function (id) {
    const selector = $(id);
    selector.on('change', function () {
        const text = selector.val();
        if(seen[text]) {
            // update some fields here
        } else {
            //more stuff here
        }
    })
}

但是我需要在 if 语句中做同样的事情,但条件不同或相似

const updateText2 = function (id) {
    const selector = $(id);
    selector.on('change', function () {
        const text = selector.val();
        if(seen[text] || text.trim() === '') {
            // update some fields here
        } else {
            //more stuff here
        }
    })
}

然后else函数就这样使用

obj1 = {
  test: function() { updateText1(this.id) }
}

obj2 = {
  test: function() { updateText2(this.id) }
}

我知道我可以将逻辑组合在一起,但是,由于这个函数所附加的两个对象处理的事情略有不同,我试图让我的代码保持干爽,而不是多次重复 if 主体。我试过像这样注入逻辑

obj2 = {
  // logic code here
  test: function() { updateText2(this.id, logic) }
}

但这会导致代码不更新,因为值是通过 jQuery 更改时获得的。

我是不是想多了,我是应该结合逻辑,还是有更好的方法来组织和处理这个问题?

最简单的解决方案是传递回调,这可能就是您想要做的。

示例:

const updateText = function (id, predicate) {
    const selector = $(id);
    selector.on('change', function () {
        const text = selector.val();
        if(predicate(text)) {
            // update some fields here
        } else {
            //more stuff here
        }
    })
}

然后可以通过以下方式调用

function canUpdate1(text) {
  return seen[text];
}

function canUpdate2(text) {
  return seen[text] || text.trim() === '';
}

updateText('id1', canUpdate1);
updateText('id2', canUpdate2);