2012-04-03 25 views
8

Tengo una matriz en jQuery, y necesito contar el número de cadenas "verdaderas" en esa matriz, y luego hacer que la variable "numOfTrue" sea igual al número de cadenas verdaderas. Así que en la matriz a continuación, hay 2 cadenas "verdaderos", por lo numOfTrue serían iguales a 2.Contar instancias de cadena en una matriz

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

No estoy seguro de cómo hacer un bucle a través de la matriz en jQuery para contar las cuerdas. ¿O es necesario un bucle?

El número de cuerdas verdaderas podría cambiar desde cualquier lugar entre 1 a 5.

+0

No se requiere jQuery aquí, este es el país de Javascript. –

+2

Puede usar '.each()' para bucle, y '.filter()' o '.map()' para que sea más funcional. ¿Pero realmente necesitas usar jQuery? – NicoSantangelo

+3

No tiene una "matriz en jQuery", tiene una "matriz en * JavaScript *". Estás programando en el lenguaje JavaScript; solo estás usando la biblioteca jQuery. –

Respuesta

24

el uso de un, pasado de moda bucle básico:

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

o, un reduce

var numOfTrue = Answers.reduce(function(p,c){ 
    if(c === "true") 
     p++; 
    return p; 
},0); 

o una filter

var numOfTrue = Answers.filter(function(x){ return x === "true"; }).length; 
+0

Esta fue la primera solución que probé y funcionó. – Livi17

+0

+1 - Parece la mejor solución para sus necesidades. –

+0

mm Tuve la misma pregunta hace un año: P –

10

No es necesario jQuery para este .. un simple bucle for como a continuación haría el truco,

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++; 
    } 
} 

o incluso sin un bucle, DEMO

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

Subió para corregir un poco el saldo de puntos: D – Jamiec

+1

Una solución más universal sería 'Answers.join (','). Match (/ (?:, | ^) True (?:, | $)/G) .length'. Esto manejará situaciones donde un término puede ser una cadena secundaria de otro (es decir, el conjunto contiene tanto "verdadero" como "verdadero" y solo desea contar la cadena exacta "verdadera"). Demostración de Regex: http://regexpal.com/?flags=gm®ex=(%3F%3A%2C%7C%5E)true(%3F%3A%2C%7C%24)&input=true%2Cfalse%0Atrue%2Cfalse % 2Ctruest% 2Ctrue% 0Afalse% 2Ctrue% 2Cfalse – craigpatik

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

no lo suficiente jQuery – NicoSantangelo

+1

@Nicosunshine - No es necesario utilizar 'jQuery' para cosas simples como esta. – ShankarSangoli

+1

Fue una broma :) mira esto: http://www.doxdesk.com/img/updates/20091116-so-large.gif – NicoSantangelo

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

http://jsfiddle.net/3PpJS/

+0

$ .each ¿en qué? Debes cambiar eso a '$ .each (Answers, ...)' –

+0

Lo noté después de publicar. Tu rápido! –

+0

Bueno, la cosa es ... alguien vio '$ .each' y votó a favor ... aunque no fue correcto (inicialmente) –

1

Si quería usar jQuery (y TBH, no deberías t para esto) esto va a funcionar:

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

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

El equivalente Javascript es:

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

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

Podría ser, no lo que el rendimiento de usar, pero se puede utilizar el filtrado y luego contar usando grep:

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

+ 1 para '$ .grep'. :-) –

+0

No es tan eficiente como un bucle 'for' o' each', pero me gusta cómo pudiste bajarlo a 1 línea :). FWIW si jQuery tiene un método 'reduce', usted podría crear un eficiente un-liner ... –

+2

@Samich - También es posible hacer esto en JavaScript puro:' Answers.filter (function (v) {return v === "true";}). length; ' –

0

Puede usar jQuery.each para iterar sobre la lista, por ejemplo:

var Answers = [ "true", "false", "false", "true", "false" ]; 
var numOfTrue = countTrue(Answers); 

alert(numOfTrue); 

function countTrue(Answers){ 
var numOfTrue = 0; 
jQuery.each(Answers, function(i, value) { 
    if (value === "true") 
     numOfTrue++; 
}); 

return numOfTrue; 
} 

Aquí es una jsFiddle si quiere jugar con ella: http://jsfiddle.net/HHrwc/

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/

5

No es necesario jQuery para esta tarea. Simplemente Javascript. La mejor respuesta viene dada por Jamiec, también puede usar las funciones filter o reduce que están disponibles para las matrices.

función de filtro:

var numOfTrue = Answers.filter(function(item){ return item === "true"; }).length 

Aquí están proporcionando la función de devolución de llamada que se ejecuta para todos los elementos de matriz. Si esta función devuelve true, este elemento estará en la matriz devuelta. A continuación, se obtiene la longitud de esta matriz (longitud de ["true", "true"] matriz es 2)

reducen la función:

var numOfTrue = Answers.reduce(function(counter, item){ return counter + (item === "true" ? 1 : 0); }, 0); 

reducir la función de devolución de llamada tiene por función que se ejecuta para todos los elementos de matriz. El elemento de matriz se proporciona como segundo argumento, el primero es el valor de retorno de la devolución de llamada ejecutada previamente. El segundo argumento de la función de reducción es el valor inicial que se proporciona para la primera función de devolución de llamada. Si omite esto, se proporciona el primer elemento del conjunto (en este ejemplo, si olvida agregar 0 como segundo argumento, el valor resultante será "true0010" cadena, porque en lugar de agregar números se concatenarán picaduras)

+0

Me gusta el one-liner, pero tenga cuidado: 'filter' y' reduce' no funcionan en navegadores antiguos, p. IE 8 o inferior. Sin embargo, uno podría considerar usar la opción 'grep' de JQuery. –

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