1

以下の関数では、文字列を含む配列 (インシデント) を反復処理します。文字列は、別の Web アプリからスクラップされたインシデント (犯罪または事故) を記述しており、私が行っているのは、さまざまな犯罪/事故を分割してカウントし、それらをオブジェクト (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++;
});
4

2 に答える 2

1

false「each」ハンドラーから戻って反復を停止できます。

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

編集— そして、外側のループの最後に、その外側の別のテストが必要になるでしょう (私が思うに):

  j++; // I don't understand what that does ...
  if (matchFound) return false;
于 2013-02-18T16:45:11.123 に答える
0

私は以下のこの解決策が機能することを発見しました。私がしたことは次のとおりです。

  1. 2番目のforEachステートメントを「every」に置き換えました
  2. 「if(matchFound)」内に「returnfalse」を入れてください
  3. 一致するものが見つからない場合にループが続行されるように、「else{returntrue;}」を追加しました。

コード:

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;
    }
});
于 2013-02-18T17:52:47.080 に答える