2013-02-18 2 views
1

아래 함수에서 문자열이 포함 된 배열 (인시던트)을 반복합니다. 문자열은 다른 웹 응용 프로그램에서 파기 된 사건 (범죄 또는 사고)을 설명하고 있으며, 내가하고있는 일은 다른 범죄/사고를 나누어 계산하여 객체에 넣는 것입니다 (INCIDENT_MATCHES).정규 표현식과 일치하는 항목을 하나만 가져 오기

그러나 일부 텍스트 문자열에는 내가 검색하는 여러 키워드 (예 : '총격'및 '배터리')가 포함될 수 있지만 원하지 않는 텍스트 문자열이있을 수 있습니다. 대신 나는 단지 처음 발견 된 단어를 계산하기를 원합니다. 더 많은 키워드가 발견되면 무시해야합니다.

어떻게이 작업을 수행 할 수 있습니까?

var INCIDENT_MATCHES = { 
    battery: /\w*(bråk)\w*|överfall|slagsmål|slogs|misshandel|misshandlad|\w*(tjuv)\w*/ig, 
    burglaries: /snattade|snattare|snatta|inbrott|bestulen|stöld|\w*(tjuv)\w*/ig, 
    robberies: /\w*(rån)\w*|personrån|\w*(ryckning)\w*|väskryckt*/ig, 
    gunfire: /skottlossning|skjuten|sköt/ig, 
    drugs: /narkotikabrott/ig, 
    vandalism: /skadegörelse|klotter|\w*(klottra)\w*/ig, 
    trafficAccidents: /(trafik|bil)olycka|(trafik|bil)olyckor|\w*(personbil)\w*|singelolycka|kollision|\w*(kollidera)\w*|påkörd|trafik|smitningsolycka/ig, 
}; 

var j = 0, 
incidentCounts = {}, 
incidentTypes = Object.keys(INCIDENT_MATCHES); 

incidents.forEach(function(incident) { 
    matchFound = false; 

    incidentTypes.forEach(function(type) { 
     if(typeof incidentCounts[type] === 'undefined') { 
      incidentCounts[type] = 0; 
     } 
     var matchFound = incident.match(INCIDENT_MATCHES[type]); 

     if(matchFound){ 
      matchFound = true; 
      incidentCounts[type] += 1; 
     } 
    }); 

    j++; 
}); 

답변

1

당신은 반복을 중지 "각"핸들러에서 false을 반환 할 수 있습니다.

if(matchFound){ 
     matchFound = true; 
     incidentCounts[type] += 1; 
     return false; 
    } 

편집 — 당신이 (내가 생각하는)하려는 외부 루프의 끝에서 그 외부의 다른 테스트 것 :

j++; // I don't understand what that does ... 
    if (matchFound) return false; 
+0

. 일치하는 문자열이 발견되면 일치하는 문자열이 다시 검색됩니다. – holyredbeard

+0

@holyredbeard 아, 외부 "루프"('.each()')에 대해 또 다른'return false; '가 필요할 수도 있습니다 - 응답을 업데이트 할 것입니다. – Pointy

+0

당신의 솔루션을 실험 해본 결과 두 번째 'forEach'문을 'every'로 변경하고 if (matchFound) 내부에 'return false'를 넣은 다음 else else {return true;}를 쓰는 것이 트릭을 수행한다는 것을 알았습니다! – holyredbeard

0

내가 아래에이 솔루션이 작동하는 것으로 확인. 내가 한 일은이었다 다음

  1. 나는 "모든"
  2. 넣어
  3. 추가 "(matchFound)가"내부 "false를 반환"과 두 번째 foreach 문을 교체 "다른 {TRUE를 반환;}" 일치하는 것이 없으면 루프가 계속됩니다.

코드 :이 실제로 어떤 이유에 의해 카운트를 멈추지 않습니다

incidents[2].forEach(function(incident) { 
    matchFound = false; 

    incidentTypes.every(function(type) { 
     if(typeof crimesPerType[type] === 'undefined') { 
      crimesPerType[type] = 0; 
    } 
    var matchFound = incident.match(INCIDENT_MATCHES[type]); 

    if(matchFound){ 
     crimesPerType[type] += 1; 
     if (type == 'trafficAccidents') { 
      incidents[3][j].push('traffic'); 
     } 
     else { 
      incidents[3][j].push('crime'); 
     } 
     return false; 
    } 
    else { 
     return true; 
    } 
}); 
관련 문제