2017-12-27 187 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()也可以提高效率因爲每次循環運行時函數都不必重新實例化。它可以重複使用相同的功能。

一旦封閉函數結束執行循環,變量就不復存在。