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

时间:2017-10-04 16:42:23

标签: javascript

我有一个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
    }
  }
}

PS。我没有经过一些不可能阅读的高尔夫黑魔法代码。只是一些更短,更简洁,更明智的东西。

2 个答案:

答案 0 :(得分:0)

如果存在限制,您只需要测试限制,因此只需检查选项数组是否已定义&amp;在担心对您的数据做任何事情之前都有元素。

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

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);
    }
  }
}

答案 1 :(得分:0)

如果我理解正确,我认为你可以将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
  }
}