我正在尝试最小化一个小型js程序,但遇到了这个问题:我不想写很多if-else
语句,它们都做同样的事情。有没有一种优雅的方法可以重写此功能?
function advance_bthrads(toCompare, arr) {
arr.forEach(function(element) {
if (element.value) {
let wf = element.value['wait_for'];
let req = element.value['request'];
if (wf && req) {
if (toCompare === wf[0] || toCompare === req[0]) {
element = update_element(element);
}
} else if (wf) {
if (toCompare === wf[0]) {
element = update_element(element);
}
} else if (req) {
if (toCompare === req[0]) {
element = update_element(element);
}
}
}
});
return arr;
}
答案 0 :(得分:1)
User with user10 name logged in (user10 IS admin):
GET ip/userprofiles will return ALL users profiles.
GET ip/licences will return ALL licences (for all user).
不返回任何内容-使用forEach
:
map
答案 1 :(得分:1)
暂时忽略element = update_element(element);
一无所获的事实(因为您只是更新本地element
,而不是它引用的内容),您的情况可以简化为
if((wf && wf[0] == toCompare) || (req && toCompare == req[0]))
由于基本检查是toCompare
等于wf[0]
还是req[0]
,因此您基本上要添加一个检查以查看wf
和req
是否存在。 / p>
此时,您可以使用map
而不是forEach
来获得所需的结果。请注意,您必须return
映射,并且任何调用advance_bthreads
的函数都需要重新分配结果(即arr = advance_bthreads(toCompare, arr);
)
function advance_bthrads(toCompare, arr) {
return arr.map(function(element) { // NOTICE you have to return the result
if (element.value) {
let wf = element.value['wait_for'];
let req = element.value['request'];
if((wf && wf[0] == toCompare) || (req && toCompare == req[0]))
element = update_element(element);
}
return element;
}
}
答案 2 :(得分:0)
您可以通过提前返回并合并条件来缩短它的时间。
顺便说一句,该分配无法按预期工作,您需要将数组的元素与索引一起使用。
如果update_element
突变了element
,则无需分配。
function advance_bthrads(toCompare, arr) {
arr.forEach(function(element, index, array) {
if (!element.value) return;
let wf = element.value['wait_for'];
let req = element.value['request'];
if (wf && toCompare === wf[0] || req && toCompare === req[0]) {
array[index] = update_element(element);
}
});
return arr;
}