Javascript 如果未定义或为空或indexOf匹配,则

Javascript 如果未定义或为空或indexOf匹配,则,javascript,Javascript,我有一个javascript函数,其中可以传递一个选项。该选项用于指定限制,因此,如果该选项未定义、为null或为空数组,则不应用任何限制,并测试所有数据行。如果提供了一个选项数组,那么只有与其中一个限制匹配的数据行才会被删除 也就是说,函数需要测试数据数组的每个元素,然后如果提供了限制选项,还可以选择检查限制选项 编写测试的方法是否更短? function dostuff (data, option) { for (var i = 0; i < data.length; i++) {

我有一个javascript函数,其中可以传递一个选项。该选项用于指定限制,因此,如果该选项未定义、为null或为空数组,则不应用任何限制,并测试所有数据行。如果提供了一个选项数组,那么只有与其中一个限制匹配的数据行才会被删除

也就是说,函数需要测试数据数组的每个元素,然后如果提供了限制选项,还可以选择检查限制选项

编写测试的方法是否更短?

function dostuff (data, option) {
  for (var i = 0; i < data.length; i++) {
    if ((test(data[i].x) && !option) ||
        (test(data[i].x) && !option.length) ||
        (test(data[i].x) && Array.isArray(option) && option.length && option.indexOf(data[i].y) != -1)
       ) // ZOMG! Can this be shorter?
    {
      // do stuff
    }
  }
}
函数dostuff(数据,选项){
对于(变量i=0;i


顺便说一句,我不是在追求一些不可能读懂的高尔夫黑魔法代码。只是一些简短而合理的东西。

如果存在限制,您只需要测试限制,所以在担心对数据执行任何操作之前,只需检查选项数组是否定义了元素

如果选项数组包含元素,则可以使用嵌套循环对照选项中的每个元素检查数据中的每个元素。如果选项通过您的检查,请执行您需要的任何处理:

function dostuff (data, option) {
  // Option MUST be an array with length 
  // if you're going to check data against the options
  // so:
  if(typeof option !== 'undefined' && option.length > 0) {
    for (var i = 0; i < data.length; i++) {
      for(var p = 0; p < option.length; p++) {
        if(test(data[i].x) [AGAINST] option[p] [IS ALLOWED]) {
          processDataAsNeeded(data[i].x);
        } else {
          // Nothing needs to happen here, as data[i].x was restricted by option[p]
        }
      }
    }
  } else { // Here there are no restrictions, so process everything
    for (var i = 0; i < data.length; i++) {
        processDataAsNeeded(data[i].x);
    }
  }
}
函数dostuff(数据,选项){
//选项必须是长度为的数组
//如果要对照选项检查数据
//因此:
如果(选项的类型!==“未定义”&&option.length>0){
对于(变量i=0;i
如果我理解正确,我认为您可以将If语句简化为:

if (typeof(option) == "undefined" || !option.length) {
  continue;
} else {
  if (test(data[i].x)) {
    // do stuff
  }
}
或者更短

if ( !(typeof(option) == "undefined" || option.length) ) {
  if (test(data[i].x)) {
    // do stuff
  }
}

请添加一些函数调用和所需结果。好的(test(data[i].x)不需要在每一行上进行测试…不完全-函数需要测试数组中的每个元素,如果没有限制,则在元素满足某个测试()时执行操作;如果有限制,则仅在两个测试()时执行操作&&限制也匹配。@Erics当您说“需要测试数组的每个元素”时,您的意思是测试数据数组的每个元素还是选项数组的每个元素?始终测试数据数组的每个元素,如果指定,还根据限制进行测试。答案已更新-这更符合您的要求吗?什么这是
test()?