在数组中计算字符串的出现次数

24

我在jQuery中有一个数组,需要计算该数组中“true”字符串的数量,并将“numOfTrue”变量设置为真字符串的数量。因此,在下面的数组中,有2个“true”字符串,因此numOfTrue等于2。

var numOfTrue;
var Answers = [ "true", "false", "false", "true", "false" ];

我不确定如何在jQuery中遍历数组以计算字符串。或者循环甚至是必要的吗?

真实字符串的数量可能从1到5个不等。


1
这里不需要 jQuery,这是 JavaScript 的地盘。 - Rory McCrossan
3
你可以使用.each()来循环,.filter().map()则可以更加函数化。 但是你真的需要使用jQuery吗? - nicosantangelo
3
你没有所谓的“jQuery数组”,你有的是“JavaScript中的数组”。你正在使用JavaScript语言进行编程,只是在使用jQuery库。 - gen_Eric
感谢澄清,Rocket。我使用了下面的一个JavaScript示例。 - Livi17
14个回答

63

使用基本的、老式的循环:

var numOfTrue = 0;
for(var i=0;i<Answers.length;i++){
    if(Answers[i] === "true")
       numOfTrue++;
}

或者使用一个 reduce 函数

var numOfTrue = Answers.reduce((acc,curr) => {
    if(curr === "true")
       acc++;
    return acc;
},0);

或者一个筛选器

var numOfTrue = Answers.filter(x => x === "true").length;

2
如果你要查找已知值,这很棒,但如果数组中有几个随机项怎么办? - Coded Container
1
@CodedContainer,那么你有一个与这个问题不同的问题 ;) - Jamiec

11

你不需要使用jQuery.. 像下面这样简单的for循环就可以达到目的:

var numOfTrue = 0;
var Answers = [ "true", "false", "false", "true", "false" ];

for (var i = 0; i < Answers.length; i++) {
    if (Answers[i] === "true") { //increment if true
      numOfTrue++; 
    }
}

甚至可以不使用循环,DEMO

Answers.toString().match(/true/g).length

2
一个更通用的解决方案是 Answers.join(',').match(/(?:,|^)true(?:,|$)/g).length。这将处理一个术语可能是另一个子字符串的情况(即数组包含“true”和“truest”,您只想计算确切的字符串“true”)。正则表达式演示:http://regexpal.com/?flags=gm&regex=(%3F%3A%2C%7C%5E)true(%3F%3A%2C%7C%24)&input=true%2Cfalse%0Atrue%2Cfalse%2Ctruest%2Ctrue%0Afalse%2Ctrue%2Cfalse - craigpatik

7

虽然这种方法可能不是很高效,但您可以使用过滤器,然后使用grep函数进行计数:

var num = jQuery.grep(Answers, function (a) { return a == "true"; }).length;

虽然不如for循环或each循环高效,但我喜欢你将其精简至一行的方式: )。顺便说一句,如果jQuery有一个reduce方法,你就可以创建一个高效的一行代码... - Justin Ethier
2
@Samich - 这也可以用纯JavaScript来实现:Answers.filter(function(v){ return v === "true"; }).length; - Justin Ethier
@JustinEthier FYI .filter 不兼容IE 8. :( http://kangax.github.com/es5-compat-table/ - Selvakumar Arumugam
@SKS - 很好知道,谢谢。无论如何,这更多的是好奇心 - 最好的解决方案就是使用一个 for 循环。 - Justin Ethier

7
这个任务不需要使用jQuery,只需使用纯Javascript。最佳答案由Jamiec提供,但您也可以使用数组的filterreduce函数。 筛选函数:
var numOfTrue = Answers.filter(function(item){ return item === "true"; }).length

在这里,您提供了一个回调函数,该函数对数组中的每个项进行执行。如果此函数返回true,则此项将在返回的数组中。然后,您可以获取此数组的长度(["true","true"]数组的长度为2)。 reduce函数:
var numOfTrue = Answers.reduce(function(counter, item){ return counter + (item === "true" ? 1 : 0); }, 0);

Reduce函数需要回调函数,以便对数组中的每个项执行操作。数组项作为第二个参数提供,第一个参数是先前执行的回调函数的返回值。Reduce函数的第二个参数是初始值,用于第一个回调函数。如果您省略此参数,则会提供数组的第一项(在本例中,如果您忘记将0添加为第二个参数,则结果值将是"true0010"字符串,因为您将连接字符串而不是添加数字)。


我喜欢这个一行代码,但要小心:filterreduce在旧的浏览器中不起作用,例如IE 8或更低版本。不过可以考虑使用JQuery的grep选项。 - Pascal Lindelauf

2

您还可以使用正则表达式String.prototype.match()

代码:

const Answers = [ "true", "false", "false", "true", "false" ];
const count = Answers.toString().match(/true/g).length;

console.log(count)


1
arr = [true,true,true,false,false]
n = arr.join('').split("true").length-1

1
var numOfTrue = 0;
for(var i = 0, len = Answers.length;i < len; i++){
    if(Answers[i] === "true"){
       numOfTrue++;
    }
}

1
@Nicosunshine - 对于这种简单的事情,没有必要使用jQuery - ShankarSangoli
2
这只是一个玩笑 :) 看看这个:http://www.doxdesk.com/img/updates/20091116-so-large.gif - nicosantangelo

1

$.each 在什么上面?你需要将其更改为 $.each(Answers, ...) - Selvakumar Arumugam
我发帖后才注意到这个问题。你真快! - Kevin Bowersox
嗯,事情是这样的..有人看到了$.each并投了赞成票..尽管它最初是不正确的。 - Selvakumar Arumugam
最好使用===而不是== - Justin Ethier

1
如果你确实想使用jQuery(但说实话,这并不适合这种情况),那么这个代码可以工作:
var numOfTrue;
var Answers = [ "true", "false", "false", "true", "false" ];

$.each(Answers, function(i, item) {
    if (item == "true")
        numOfTrue++;
});

JavaScript 的等效语句是:

var numOfTrue;
var Answers = [ "true", "false", "false", "true", "false" ];

for (var i = 0; i < Answers.length; i++) {
    if (answers[i] == "true")
        numOfTrue++;
});

1
var numOfTrue;
var Answers = [ "true", "false", "false", "true", "false" ];
var i = 0;
$.each(Answers, function(index, value){
    if(value == "true")
    {
        i++;
    }
});


alert(i);

http://jsfiddle.net/kpcrash/Xxcw6/


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