Выяснение, сколько раз появляется элемент массива

Я новичок в JavaScript, я изучаю и практикую около 3 месяцев и надеюсь, что смогу получить помощь по этой теме. Я'я играю в покер и что яя пытаюсь определить, есть ли у меня пара, две пары, тройка, четверка или фулл-хаус.

Например, в[1, 2, 3, 4, 4, 4, 3], 1 появляется один раз, 4 появляется три раза и так далее.

Как я могу попросить мой компьютер сказать мне, сколько раз появляется элемент массива?

Решено, здесьс конечным продуктом.

    
    var deck = [];
    var cards = [];
    var convertedcards = [];
    var kinds = [];
    var phase = 1;
    var displaycard = [];
    var options = 0;
    var endgame = false;

    // Fill Deck //
    for(i = 0; i < 52; i++){
        deck[deck.length] = i;          
    }

    // Distribute Cards //
    for(i = 0; i < 7; i++){
        cards[cards.length] = Number(Math.floor(Math.random() * 52));
        if(deck.indexOf(cards[cards.length - 1]) === -1){
            cards.splice(cards.length - 1, cards.length);
            i = i - 1;
        }else{
            deck[cards[cards.length - 1]] = "|";
        }
    }

    // Convert Cards //
    for(i = 0; i < 7; i++){
        convertedcards[i] = (cards[i] % 13) + 1;
    }


    // Cards Kind //
    for(i = 0; i < 7; i++){
        if(cards[i] < 13){
            kinds[kinds.length] = "H";
        }else if(cards[i] < 27 && cards[i] > 12){
            kinds[kinds.length] = "C";
        }else if(cards[i] < 40 && cards[i] > 26){
            kinds[kinds.length] = "D";
        }else{
            kinds[kinds.length] = "S";
        }
    }

    // Card Display //
    for(i = 0; i < 7; i++){
        displaycard[i] = convertedcards[i] + kinds[i];
    }

    // Hand Strenght //
    var handstrenght = function(){
        var usedcards = [];
        var count = 0;
        var pairs = [];
        for(i = 0, a = 1; i < 7; a++){
            if(convertedcards[i] === convertedcards[a] && a < 7 && usedcards[i] != "|"){
                pairs[pairs.length] = convertedcards[i];
                usedcards[a] = "|";
            }else if(a > 6){
                i = i + 1;
                a = i;
            }
        }

        // Flush >.< //
        var flush = false;
        for(i = 0, a = 1; i < 7; i++, a++){
            if(kinds[i] === kinds[a] && kinds[i] != undefined){
                count++;
                if(a >= 6 && count >= 5){
                    flush = true;
                    count = 0;
                }else if(a >= 6 && count < 5){
                    count = 0;
                }
            }
        }
        // Straight >.< //
        var straight = false;
        convertedcards = convertedcards.sort(function(a,b){return a-b});
        if(convertedcards[2] > 10 && convertedcards[3] > 10 && convertedcards[4] > 10){
            convertedcards[0] = 14;
            convertedcards = convertedcards.sort(function(a,b){return a-b});
        }
        alert(convertedcards);
        if(convertedcards[0] + 1 === convertedcards[1] && convertedcards[1] + 1 === convertedcards[2] && convertedcards[2] + 1 === convertedcards[3] && convertedcards[3] + 1 === convertedcards[4]){
            straight = true;
        }else if(convertedcards[1] + 1 === convertedcards[2] && convertedcards[2] + 1 === convertedcards[3] && convertedcards[3] + 1 === convertedcards[4] && convertedcards[4] + 1 === convertedcards[5]){
            straight = true;
        }else if(convertedcards[2] + 1 === convertedcards[3] && convertedcards[3] + 1 === convertedcards[4] && convertedcards[4] + 1 === convertedcards[5] && convertedcards[5] + 1 === convertedcards[6]){
            straight = true;
        }
        // Royal Flush, Straight Flush, Flush, Straight >.< //
        var royalflush = false;
        if(straight === true && flush === true && convertedcards[6] === 14){
            royalflush = true;
            alert("You have a Royal Flush");
        }
        else if(straight === true && flush === true && royalflush === false){
            alert("You have a straight flush");
        }else if(straight === true && flush === false){
            alert("You have a straight");
        }else if(straight === false && flush === true){
            alert("You have a flush");
        }
        // Full House >.< //
        if(pairs[0] === pairs[1] && pairs[1] != pairs[2] && pairs.length >= 3){
            fullhouse = true;
            alert("You have a fullhouse");
        }else if(pairs[0] != pairs[1] && pairs[1] === pairs[2] && pairs.length >= 3){
            fullhouse = true;
            alert("You have a fullhouse");
        }else if(pairs[0] != pairs[1] && pairs[1] != pairs[2] && pairs[2] === pairs[3] && pairs.length >= 3){
            fullhouse = true;
            alert("You have a fullhouse");
        }
        // Four of a kind >.< //
        else if(pairs[0] === pairs[1] && pairs[1] === pairs[2] && pairs.length > 0){
            alert("You have four of a kind");
        }
        // Three of a kind >.< //
        else if(pairs[0] === pairs[1] && flush === false && straight === false && pairs.length === 2){
            alert("You have three of a kind");
        }
        // Double Pair >.< //
        else if(pairs[0] != pairs[1] && flush === false && straight === false && pairs.length > 1){
            alert("You have a double pair");
        }
        // Pair >.< //
        else if(pairs.length === 1 && flush === false && straight === false && pairs.length === 1 ){
            alert("You have a pair");
        }
        alert(pairs);
    };
    while(endgame === false){
        if(phase === 1){
            options = Number(prompt("Your hand: " + displaycard[0] + " " + displaycard[1] + "\n\n" + "1. Check" + "\n" + "2. Fold"));
        }else if(phase === 2){
            options = Number(prompt("Your hand: " + displaycard[0] + " " + displaycard[1] + "\n\n" + displaycard[2] + " " + displaycard[3] + " " + displaycard[4] + "\n\n" + "1. Check" + "\n" + "2. Fold"));
        }else if(phase === 3){
            options = Number(prompt("Your hand: " + displaycard[0] + " " + displaycard[1] + "\n\n" + displaycard[2] + " " + displaycard[3] + " " + displaycard[4] + " " + displaycard[5] + "\n\n" + "1. Check" + "\n" + "2. Fold"));
        }else if(phase === 4){
            options = Number(prompt("Your hand: " + displaycard[0] + " " + displaycard[1] + "\n\n" + displaycard[2] + " " + displaycard[3] + " " + displaycard[4] + " " + displaycard[5] + " " + displaycard[6] + "\n\n" + "1. Check" + "\n" + "2. Fold"));
        }
        switch(options){
            case 1:
                    if(phase === 5){
                        handstrenght();
                        endgame = true;
                    }else{
                        phase++;
                    }
                    break;
            case 2:
                    endgame = true;
                    break;
            default:
                    endgame = true;
                    break;
        }
    }



 chuckj15 нояб. 2012 г., 00:53
@JuanMendes Я бы проголосовал за твой комментарий 20 раз, если бы мог :-).
 I Hate Lazy15 нояб. 2012 г., 00:53
Где ты застрял? Вы знаете, как сделатьfor цикл?
 Juan Mendes15 нояб. 2012 г., 00:50
Вы пробовали что-нибудь? Дон»не хочу просто разглашать этот секрет или удерживать вас от обучения;)

Ответы на вопрос(6)

вы можете использоватьfilter(), (Страница MDN также предоставляет полифилл для этой функции.)

var items = [1, 2, 3, 4, 4, 4, 3];
var fours = items.filter(function(it) {return it === 4;});
var result = fours.length;

Вы даже можете абстрагироваться от функции фильтрации следующим образом:

// Creates a new function that returns true if the parameter passed to it is 
// equal to `x`
function equal_func(x) {
    return function(it) {
        return it === x;
    }
}
//...
var result = items.filter(equal_func(4)).length;
 Oriol30 янв. 2017 г., 18:23
Это тратит слишком много памяти.
 millimoose17 мар. 2016 г., 04:07
@JuanMendes - Спасибо, я сделал формулировку ответа более точной.
 millimoose30 янв. 2017 г., 19:29
@Oriol Использует O (N) память, в худшем случае, для предположительно крошечных значений N, накладные расходы памяти совершенно неактуальны в практическом контексте. Если ты можешь'ты не сможешь сэкономить столько памяти, ты, вероятно, не сможешьне хранить исходный массив. Если вам нужно обработать обширный набор данных и ищите SO ответы на вопросы школьных заданий для хитов 'У меня проблемы хуже.
 millimoose30 янв. 2017 г., 19:34
Редуцированная версия была бы более эффективной, но уменьшала быслишком читабельным, как я догадался, ОПs уровень квалификации, и версия цикла уже принятый ответ, так что яя не собираюсь редактировать 4-летний ответ, чтобы он существенно отличался от того, за который проголосовали, еслиявно неправильно.
 Juan Mendes16 мар. 2016 г., 21:23
Это'поддерживается с IE9developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...

filter а такжеlength это кажется простым, но есть большая трата памяти.

Если вы хотите использовать хорошие методы массива, подходящим является:reduce

function countInArray(array, value) {
  return array.reduce((n, x) => n + (x === value), 0);
}
console.log(countInArray([1,2,3,4,4,4,3], 4)); // 3

 vsync25 авг. 2018 г., 21:58
Кстати, это гений!
 vsync25 авг. 2018 г., 21:52
big waste of memory - не могли бы вы объяснить, почему?
Решение Вопроса
Сохраняйте переменную для общего количестваПрокрутите массив и проверьте, совпадает ли текущее значение с тем, которое выищите, если это так, увеличивайте общее количество на единицуПосле цикла total count содержит количество раз, которое вы искали в массиве

и мы можем помочь вам выяснить, где это пошло не так

Вот'простая реализация (так как вы нене иметь код, который нет работа)

var list = [2, 1, 4, 2, 1, 1, 4, 5];  

function countInArray(array, what) {
    var count = 0;
    for (var i = 0; i < array.length; i++) {
        if (array[i] === what) {
            count++;
        }
    }
    return count;
}

countInArray(list, 2); // returns 2
countInArray(list, 1); // returns 3

countInArray также мог бы быть реализован как

function countInArray(array, what) {
    return array.filter(item => item == what).length;
}

Более элегантный, но, возможно, не такой производительный, поскольку он должен создать новый массив.

 Frederic Daniel15 нояб. 2012 г., 02:14
Вот'код и яЯ все еще застрял на том же месте. [1,1,2,2,3,3,5] работает, но [1,2,1,2,3,3,5] не работаетт. Потрясающие
 Steffi04 авг. 2017 г., 16:27
оно работает! Благодарю. @JuanMendes
 Frederic Daniel15 нояб. 2012 г., 01:10
Мой код небольше не существую, я разозлился 1 месяц назад после попытки исправить эту проблему в течение 6 часов подряд и удалил проект.
 Juan Mendes15 нояб. 2012 г., 01:04
@FredericDaniel Покажите свой код, вопросы здесь, в SO, должны всегда показывать код, ожидаемые / фактические результаты и любые сообщения об ошибках
 Juan Mendes15 нояб. 2012 г., 01:16
Тогда попробуйте еще раз и опубликуйте здесь, если можетене заставить его работать, непросто сдаться
 Dake18 авг. 2016 г., 20:24
Хороший код Можете ли вы предоставить версию Java, пожалуйста?
 Juan Mendes18 авг. 2016 г., 20:28
@Dake Как насчет того, чтобы написать один и задать другой вопрос, если у вас есть проблемы?
 Frederic Daniel15 нояб. 2012 г., 02:28
Неважно, все, что мне нужно было сделать, это сделать еще что-то, чтобы увидеть, если «а» было больше 6. Теперь все работает.
 Frederic Daniel15 нояб. 2012 г., 01:03
Хорошо, если это решение, моя идея была правильной, но код нет. Я'разберусь

Вот'реализация Хуанаответ:

function count( list, x ) {

    for ( var l = list.length, c = 0; l--; ) {

        if ( list[ l ] === x ) {

            c++;
        }
    }

    return c;

}

Еще короче

function count( list, x ) {

    for ( var l = list.length, c = 0; l--; list[ l ] === x && c++ );

    return c;

}
 Juan Mendes15 нояб. 2012 г., 01:39
Зачем пытаться сделать это коротким? Сделать это просто, нет необходимости в оптимизации. Кроме того, если вы делаете это методом, вы должны передать массив, пожалуйста, нене полагайтесь на глобальное.
 0x499602D215 нояб. 2012 г., 01:41
@JuanMendes I 'Я не передаю массив, просто значение.list это массив, который ОП объявляет в своем вопросе ... :)
 Juan Mendes15 нояб. 2012 г., 01:42
Я хочу сказать, что вы должны передать это.count следует использовать массив для подсчета в качестве аргумента вместо использования глобального. В противном случае не имеет смысла делать его функцией, поскольку он может работать только с той глобальной настройкой, которую вы настроили. Смотри мой ответ.

Реализация, которая использует прототип Array Object и имеет дополнительный уровень функциональности, который возвращает длину, если элемент поиска не указан:

Array.prototype.count = function(lit = false) {
    if ( !lit ) { return this.length}
    else {
        var count = 0;
        for ( var i=0; i < this.length; i++ ) {
            if ( lit == this[i] ){
                count++
            }
        }
        return count;
    }
}

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

var count = [1,2,3,4,4].count(4);  // Returns 2
var count = [1,2,3,4,4].count();   // Without first parameter returns 5
 Juan Mendes11 сент. 2016 г., 22:45
Это возвращает 3 для[1,2,3].count(0) Я бы избавился от случая, когда тыпросто возвращаю длину
 Juan Mendes16 мар. 2016 г., 21:20
Избегайте возни с прототипом нативных объектов, это может быть несовместимо, когдаArray.prototype.count Метод стандартизирован.

Что ж..

var a = [5, 5, 5, 2, 2, 2, 2, 2, 9, 4].reduce(function (acc, curr) {
  if (typeof acc[curr] == 'undefined') {
    acc[curr] = 1;
  } else {
    acc[curr] += 1;
  }

  return acc;
}, {});

// a == {2: 5, 4: 1, 5: 3, 9: 1}

отсюда:Подсчет вхождений элементов массива JavaScript

Или вы можете найти другие решения там тоже ..

 Juan Mendes15 нояб. 2012 г., 01:01
Хороший сложный ответ, но я думаю, что это может быть немного больше, чем OP 'голова По крайней мере, это не такЯ не могу дать ответ, так как ФП все еще потребует много знаний, чтобы понять, что происходит. С другой стороны, они могут использовать ваш метод, даже не понимая его, что противоречит точке зрения SO.

Ваш ответ на вопрос