2017-12-27 221 views
0

我有以下代码:定义循环外该功能

for (var entry in metadata) { 
    if (metadata.hasOwnProperty(entry)) { 
     var varName = metadata[entry].variableName; 
     if (metadata[entry].multipleValues === "false") { 
      if (angular.isDefined(vm[varName]) && (vm[varName] !== null) && vm[varName].id !== null) { 
       filters.push(factory.buildEntry(metadata[entry].variableName, vm[varName].id, null, factory.filterOperators.textContains)); 
      } 
     } else { 
      if (angular.isDefined(vm[varName]) && (angular.isArray(vm[varName])) && (vm[varName].length > 0)) { 
       filters.push(factory.buildEntry(metadata[entry].variableName, null, vm[varName].map(function (item) { 
        return item.id; 
       }), factory.filterOperators.textContains)); 
      } 
     } 
    } 
} 

但SonarQube不断告诉我Define this function outside of a loop.,我有这个循环中的唯一功能是匿名函数我传递给Array.prototype.map()方法:

function (item) { 
    return item.id; 
} 

如果我在循环之外定义它,那么它将是无用的,因为它的主体只包含一行代码。

为什么我得到这个错误?以及如何告诉SonarQube跳过它。

+0

你自己想出了错误的原因。 “我怎么能告诉SonarQube跳过它?” - >如果可能的话,可能会添加一些评论。否则,您必须在SonarQube界面上将其标记为误报。 – acdcjunior

+0

您使用的是哪个版本的SonarJS?有一个https://jira.sonarsource.com/browse/SONARJS-772在SonarJS 3.0中修复,看起来像你的情况 –

回答

0

你怎么样定义它的循环

var mapFunction = function (item) { 
        return item.id; 
       }; 
for (var entry in metadata) { 
    if (metadata.hasOwnProperty(entry)) { 
     var varName = metadata[entry].variableName; 
     if (metadata[entry].multipleValues === "false") { 
      if (angular.isDefined(vm[varName]) && (vm[varName] !== null) && vm[varName].id !== null) { 
       filters.push(factory.buildEntry(metadata[entry].variableName, vm[varName].id, null, factory.filterOperators.textContains)); 
      } 
     } else { 
      if (angular.isDefined(vm[varName]) && (angular.isArray(vm[varName])) && (vm[varName].length > 0)) { 
       filters.push(factory.buildEntry(metadata[entry].variableName, null, vm[varName].map(mapFunction), factory.filterOperators.textContains)); 
      } 
     } 
    } 
} 

您可以指定功能的变量,然后将该变量当作一个函数

var foo = function(){console.log('bar')}; 
 
foo();

你的情况之外将映射函数分配给一个变量,然后将该变量传递给.map()也可以提高效率因为每次循环运行时函数都不必重新实例化。它可以重复使用相同的功能。

一旦封闭函数结束执行循环,变量就不复存在。