将值与值或数组匹配的函数(更好的写方法)

时间:2018-11-18 10:05:21

标签: javascript

我有一个带有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都可以使用。

4 个答案:

答案 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>