我有一个带有2个参数的函数,第一个是值,第二个可以是值或数组。 它检查第一个参数是否等于第二个参数,或者(如果它是一个数组)是否等于数组元素之一。
function matchType(value, type) {
if (Array.isArray(type)) {
for (t of type) {
if (value == t) {
return value;
}
}
} else {
if (value == type) {
return value;
}
}
return null;
}
然后它的工作原理是:
matchType(“ foo”,“ foo”)
“ foo”
matchType(“ foo”,[“ foo”,“ bar”])
“ foo”
matchType(“ foo”,[“ blah”,“ bar”])
空
最好以函数样式编写此函数的更优雅的方法是什么? ES6或lodash都可以使用。
答案 0 :(得分:4)
您可以采用数组进行检查,并使用Array#includes
进行检查,然后返回值或null
。
function matchType(value, type) {
return [].concat(type).includes(value)
? value
: null;
}
console.log(matchType("foo", "foo")); // "foo"
console.log(matchType("foo", ["foo", "bar"])); // "foo"
console.log(matchType("foo", ["blah", "bar"])); // null
答案 1 :(得分:1)
如果您可以依靠type
作为数组,则可以将value
到===
的情况下立即返回type
,否则使用条件运算符并返回{{ 1}}(如果输入value
:
includes
答案 2 :(得分:0)
首先-使用ES6的数组includes()
-here's the MDN link。
其次,您可以使用&&
,||
和... ? ... : ...
将功能短接到一行:
function matchType(value, type) {
var toReturnValue = false;
toReturnValue = Array.isArray(type) ? type.includes(value) : value === type;
return toReturnValue ? value : null;
}
答案 3 :(得分:0)
使用Ramda的功能性方法:
const matchType =
R.ifElse(R.contains,
R.nthArg(0),
R.always(null));
console.log(matchType("foo", "foo"));
console.log(matchType("foo", ["foo", "bar"]));
console.log(matchType("foo", ["blah", "bar"]));
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.js"></script>