2012-04-03 2 views
8

У меня есть массив в jQuery, и мне нужно подсчитать количество «истинных» строк в этом массиве, а затем сделать переменную numOfTrue равной числу истинных строк. Таким образом, в приведенном ниже массиве, есть 2 «истинная» строка, так numOfTrue будет равен 2.Количество экземпляров строки в массиве

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

Я не уверен, как сделать петлю через массив в JQuery для подсчета строк. Или нужна петля?

Число истинных строк может измениться из любой точки в диапазоне от 1 до 5.

+0

Здесь нет jQuery, это страна javascript. –

+2

Вы можете использовать '.each()' для цикла, а '.filter()' или '.map()' более функциональны. Но вам действительно нужно использовать jQuery? – NicoSantangelo

+3

У вас нет «массива в jQuery», у вас есть «массив в * JavaScript *». Вы программируете на языке JavaScript; вы просто используете библиотеку jQuery. –

ответ

24

Используя базовую, старомодный цикл:

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

или reduce

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

или filter

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

Это было первое решение, которое я пробовал, и это сработало. – Livi17

+0

+1 - Похоже, это лучшее решение для ваших нужд. –

+0

мм У меня были те же ans a min ago: P –

10

Вам не нужно JQuery для этого .. простой цикл, как показано ниже будет делать трюк,

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 
+0

Активировано для исправления баланса точек бит: D – Jamiec

+1

Более универсальным решением будет 'Answers.join (','). Match (/ (?:, | ^) True (?:, | $)/G) .length'. Это будет обрабатывать ситуации, когда один термин может быть подстрокой другого (т. Е. Массив содержит как «истинные», так и «истинные», и вы хотите только подсчитать точную строку «true»). Regex demo: 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

не хватает jQuery – NicoSantangelo

+1

@Nicosunshine - Нет необходимости использовать 'jQuery' для простых вещей, подобных этому. – ShankarSangoli

+1

Это была шутка :) посмотрите на это: 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 (Answers, ...)' –

+0

Я заметил это после того, как я опубликовал. Быстро! –

+0

Ну, дело в том, что .. кто-то видел '$ .each' и проголосовал ... хотя это было неправильно (изначально) –

1

Если вы действительно хотели использовать JQuery (и ТБХ, вы не должны» T для этого), это будет работать:

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

Это может быть не так производительность дружелюбной, но вы можете использовать фильтрацию, а затем рассчитывать с помощью grep:

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

+ 1 для '$ .grep'. :-) –

+0

Не так эффективно, как цикл 'for' или' each', но мне нравится, как вы могли его довести до 1 строки :). FWIW, если у jQuery был метод 'reduce', вы могли бы создать эффективный однострочный ... –

+2

@Samich - это также можно сделать в чистом JavaScript:' Answers.filter (function (v) {return v === "true";}). length; ' –

0

Вы можете использовать jQuery.each для перебора по списку, например:

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

Вот jsfiddle, если вы хотите поиграть с ним: http://jsfiddle.net/HHrwc/

5

Вам не нужно JQuery для выполнения этой задачи. Просто Javascript. Лучший ответ дается Jamiec, вы также можете использовать filter или reduce функции, доступные для массивов.

функция фильтр:

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

Здесь вы реализующая функцию обратного вызова, которая выполняется для каждого элемента в массиве. Если эта функция возвращает true, тогда этот элемент будет в возвращенном массиве. После этого вы получите длину этого массива (длина ["true", "true"] массива 2)

уменьшить функцию:

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

Снижение функции требуется функция обратного вызова, которая выполняется для каждого элемента в массиве. Элемент массива представлен как второй аргумент, первый - это возвращаемое значение ранее выполненного обратного вызова. Второй аргумент функции уменьшения - это начальное значение, которое предоставляется для первой функции обратного вызова. Если вы опустите это, тогда будет предоставлен первый элемент из массива (в этом примере, если вы забудете добавить 0 в качестве второго аргумента, тогда значение результата будет "true0010", потому что вместо добавления чисел вы будете конкатенации укусов)

+0

Мне нравится однострочный, но будьте осторожны: 'filter' и' reduce' не работают в старых браузерах, например. IE 8 или ниже. Однако можно было бы использовать параметр 'grep' JQuery. –

0
arr = [true,true,true,false,false] 
n = arr.join('').split("true").length-1 
Смежные вопросы