1

td.aws 内の文字列が 3 回以上表示されているかどうかを確認する必要があります。表示されている場合は、その文字列を新しいリストに入れます。

私は次のようなテーブルを持っています:

<table width="100%" cellspacing="0" cellpadding="2" border="1" class="aws_data">
<tbody><tr bgcolor="#ECECEC"><th>URL (1,908)</th></tr>
<tr><td class="aws">/images/bullet3.png</td></tr>
<tr><td class="aws">/pdf-signing-tool/ErrorCode.properties</td></tr>
<tr><td class="aws">/pdf-signing-tool/Display.properties</td></tr>
<tr><td class="aws">/evcert.cfm</td></tr>
<tr><td class="aws">/evcert.cfm</td></tr>
<tr><td class="aws">/evcert.cfm</td></tr>
<tr><td class="aws">/evcert.cfm</td></tr>
<tr><td class="aws">/repository/03</td></tr>
<tr><td class="aws">/repository/0</td></tr>
etc

<div id="problems"></div>

これまでのところ、私は持っています:

$('.aws').each(function(){
var temp = $(this).text();
var count = temp.match('/'+temp+'/g');  

if (count.length > 3)
{
    thisString = $(this).text();
    $('#problems').append(thisString)
}

});

誰でも助けてもらえますか?現時点では、「カウントがnullです」というJSエラーが発生しています

JSフィドル

4

4 に答える 4

2

//store the counts for each "text" occurrence in a hash table
var countHash = {}; 

//iterate over your tds
$('.aws').each(function(){

    //pull of the text
    var temp = $(this).text();

    //has it already been added to the list? 
    //see: 'countHash[temp] = false;' below.
    if(countHash[temp] === false){return;}

    //increment the occurrence count
    //or set to 1 if this is the first occurrence.
    countHash[temp] = (countHash[temp] || 0) + 1; 

    //have more than three been found?
    if (countHash[temp] > 3)
    {
        //add to your list
        $('#problems').append(temp);

        //ignore future occurrences
        countHash[temp] = false; 
    }
});
于 2013-04-12T12:24:21.437 に答える
2

new RegExp()コメントに記載されているように、そのような正規表現は で作成する必要があります。それに加えて、各表セルの内部テキストを使用すると、括弧や疑問符などを使用すると、無効な正規表現になる可能性があります。したがって、この場合、私はそれに対してアドバイスします。

それぞれを繰り返しながら、次のように頻度カウントを行うことができますtd.aws

var frequencies = {};

$('td.aws').each(function() {
    var key = $(this).text(),
    freq = frequencies[key] || 0;

    // increase the frequency and check if it goes above 3
    if (++freq > 3) {
        $('#problems').append(key);
        freq = -Infinity;
    }

    frequencies[key] = freq;
});

デモ

オブジェクトfrequenciesは、各用語の頻度をそのプロパティに保持します。一定の数に達すると、必要なことは何でもします。

于 2013-04-12T12:29:05.070 に答える
1

問題は次のとおり'/'+temp+'/g'です。正規表現リテラルでは変数を使用できません。正規表現を文字列として作成する必要があります。

var tempRegex = new RegExp(temp, 'g');
var count = temp.match(tempRegex);

コードに大きな論理的問題があるようです。現在、テキストがそれ自体に一致するかどうかを確認する正規表現を作成していますが、これは常に一致します。重複があるかどうかを判断するために、すべての TD を検索しようとしていると思います。代わりに次のアプローチを試してください。

var items = [];

$('.aws').each(function(){
    var currentText = $(this).text();
    var duplicate = false;

    for (var i = 0; i < items.length; i++) {
        if (items[i].text === currentText) {
            items[i].count++;

            if (items[i].count > 2) {
                console.log('found more than 2 of ' + currentText);
                $('#problems').append(currentText)
            }

            duplicate = true;
            break;
        }
    }

    if (!duplicate) {
        items.push({ text: currentText, count: 1});
    }
});

http://jsfiddle.net/qT6Nz/2/

于 2013-04-12T12:24:32.077 に答える
1
var count = {};
$(".aws").each(function(i,v) {
    var temp = $(v).text();
    var current = count[temp];
    if (!current) {
        current = 0;
    }
    current++;
    count[temp] = current;
    if (current > 3) {
       $("#problems").append("<p>"+temp+"</p>");
    }
}

古いリストから 3 回出現する項目を削除するかどうかわからないので、追加しませんでした

于 2013-04-12T12:19:53.780 に答える