在表格中计算特定值出现的次数

3
我有一个包含姓名列表的 html 表格,这些姓名在句子中,放在 <td> 元素内(例如 <td>Mike (Jeremy's father) used to play piano</td><td>The only one who speaks french is Desmond, but Mike speaks very well spanish</td>)。我想要计算特定姓名在整个表格中出现的次数。我需要使用 javascript/jquery 实现,而不是通过 php。任何帮助都将不胜感激!

1
如果文本是关于鲍勃先生的,他被发现在水中漂浮,身边散落着他的钓鱼浮标收藏品的话?(请注意,这是一个无意义的句子,仅用于翻译练习) - Marc B
@MarcB 那么抛出一个 URIError - Šime Vidas
1个回答

6
你可以使用

标签

var nbMikeInTheTable = (' '+$('table').text()+' ').split('Mike').length-1;

(添加 ' ' 是为了兼容 IE 上有缺陷的 split 实现)

或者,如果您想确保它是完整的单词并且不被 HTML 截断

 var nbMikeInTheTable = $('table').html().split(/\W+/).filter(
     function(v){return v=="Mike"}
 ).length;

如果您想防止单词和单元格的结尾,并确保它不是属性的一部分,那么这需要更复杂的操作:

var nbTimesMikeIsInTheTable = $('table td').map(function(){
    return $(this).text().split(/\W+/).filter(function(v){return v=="Mike"}).length
}).toArray().reduce(function(p,v){return p+v});

这并不优雅,但可能并不需要 ;)

演示(打开控制台)


如果一个单元格以“'Mi'”结尾,下一个单元格以“'ke'”开头会怎样? - Šime Vidas
关于您的更新,这也将捕获属性名称/值中的出现情况。(我在这里充当魔鬼的代言人 :) - Šime Vidas
@ŠimeVidas 我为这个(不大可能的)风险制作了第三个版本。我相信可以把它缩短一点,但这可能不值得痛苦... - Denys Séguret
我确实设法将其缩短了一点:http://jsfiddle.net/KVYt7/1/ $.map()可以展平数组,所以我只是将TD映射到单词数组,这样就产生了一个大的单词数组。然后我只需应用过滤函数即可。 - Šime Vidas
1
...并且通过一点点的函数式编程,我们可以大大提高代码的可读性:http://jsfiddle.net/KVYt7/2/ var n = $.map( cellsArray, toWordsArray ).filter( byValue( 'Mike' ) ).length;. - Šime Vidas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接