首页 > 解决方案 > JavaScript:将条件条件作为值传递

问题描述

我有一个使用 jQuery 查找元素的函数。然后我获取该元素,从中获取一个值并将其分配给一个变量。但是,有时文档中不存在元素并且函数将返回undefined。这是预期的,如果返回的元素是undefined,那么被分配的变量也应该是undefined. 因为我多次使用这个函数来分配变量,所以我想让它整洁并且在一行上。我认为使用条件可能是一种解决方案,但是,这样做会导致非常混乱的长行并且需要调用该函数两次:

let html = $(response.body);
let language = getRowElementFromText('Language', html) ? getRowElementFromText('Language', html).find('a').text() : undefined;
let pages = getRowElementFromText('Page', html) ? parseInt(getRowElementFromText('Page', html).text()) : undefined;

是否有可能解决这些问题并以某种方式传递条件的条件以用作值?例如,在这个 pesudo 代码this中将是条件的值:

let html = $(response.body);
let language = getRowElementFromText('Language', html) ? this.find('a').text() : undefined;
let pages = getRowElementFromText('Page', html) ? parseInt(this.text()) : undefined;

如果这不可能,是否有另一种更具可读性的方式可以在一行上完成?

标签: javascript

解决方案


它是/将与ES2020 中新增的可选链接运算符一起使用(今天可通过编译获得)。代码看起来像这样(它只对parseIntcas 有很大帮助):

let language = getRowElementFromText('Language', html)?.find('a').text();
// −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−^
let pageText = getRowElementFromText('Page', html)?.text();
// −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−^
let pages = pageText ? parseInt(pageText) : undefined;

language如果undefined没有找到该元素。

如果你不能使用它(因为你的目标环境还没有它并且你没有编译),你可以传入一个函数,getRowElementFromText如果找到元素就会调用:

let html = $(response.body);
let language = getRowElementFromText('Language', html, el => el.find('a').text());
let pages = getRowElementFromText('Page', html, el => parseInt(el.text()));

getRowElementFromText看起来像这样:

function getRowElementFromText(text, html, callback) {
    const result = /*...existing logic...*/;
    return result === undefined ? undefined : callback(result);
}

或者可能像这样(callback可选):

function getRowElementFromText(text, html, callback) {
    const result = /*...existing logic...*/;
    return !callback || result === undefined ? result : callback(result);
}

注意:在上面我假设在某些情况下getRowElementFromText确实返回(“未找到”),并在其他情况下返回一个 jQuery 对象(找到)。undefined我标记它是因为如果它总是返回一个 jQuery 对象(可能是空的),那么 jQuery 对象永远不会是虚假的(甚至不是空的)。


推荐阅读