вместо этого array_count_values ​​для JavaScript - PullRequest
3 голосов
/ 07 марта 2011

У меня есть следующий PHP-скрипт, теперь мне нужно сделать то же самое в JavaScript.Есть ли в JavaScript функция, которая работает аналогично функции PHP, я искал несколько дней, но не могу найти ничего подобного?Я хочу подсчитать, сколько раз определенное слово используется в массиве.

$interfaceA = array($interfaceA_1,$interfaceA_2,$interfaceA_3,$interfaceA_4,$interfaceA_5,$interfaceA_6,$interfaceA_7,$interfaceA_8);       

$interfaceA_array=array_count_values($interfaceA);
$knappsatsA = $interfaceA_array[gui_knappsats];
$touchpanelA = $interfaceA_array[gui_touchpanel];

Ответы [ 5 ]

11 голосов
/ 07 марта 2011

Почему бы просто не создать новый массив javascript? Выполните итерацию по исходному массиву и увеличьте количество «счетчиков» для ключей, встречающихся в массиве. http://jsfiddle.net/4t28P/1/

var myCurrentArray = new Array("apple","banana","apple","orange","banana","apple");

var counts = {};

for(var i=0;i< myCurrentArray.length;i++)
{
  var key = myCurrentArray[i];
  counts[key] = (counts[key])? counts[key] + 1 : 1 ;

}

alert(counts['apple']);
alert(counts['banana']);
6 голосов
/ 27 июля 2014

Другим элегантным решением будет использование Array.prototype.reduce . Дано:

var arr = new Array("apple","banana","apple","orange","banana","apple");

Вы можете просто запустить уменьшить на нем:

var groups = 
  arr.reduce(function(acc,e){acc[e] = (e in acc ? acc[e]+1 : 1); return acc}, {});

Наконец, вы можете проверить результат:

groups['apple'];
groups['banana'];

В приведенном выше примере уменьшить принимает два параметра:

  1. функция (здесь анонимная), берущая аккумулятор (инициализированный из второго аргумента метода Reduce) и текущий элемент массива
  2. начальное значение аккумулятора

Что бы функция не возвращала, она будет использоваться в качестве значения аккумулятора при следующем вызове.

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

2 голосов
/ 07 марта 2011

Как насчет этого:

function arrayCountValues (arr) {
    var v, freqs = {};

    // for each v in the array increment the frequency count in the table
    for (var i = arr.length; i--; ) { 
        v = arr[i];
        if (freqs[v]) freqs[v] += 1;
        else freqs[v] = 1;
    }

    // return the frequency table
    return freqs;
}
0 голосов
/ 08 июля 2019

Попробуйте

a.reduce((a,c)=> (a[c]=++a[c]||1,a) ,{});

let a= ["apple","banana","apple","orange","banana","apple"];

let count= a.reduce((a,c)=> (a[c]=++a[c]||1,a) ,{});

console.log(count);
0 голосов
/ 20 октября 2018

let snippet = "HARRY POTTER IS A SERIES OF FANTASY NOVELS WRITTEN BY BRITISH AUTHOR J. K. ROWLING. THE NOVELS CHRONICLE" +
    " THE LIVES OF A YOUNG WIZARD, HARRY POTTER , AND HIS FRIENDS HERMIONE GRANGER AND RON WEASLEY, ALL OF WHOM ARE " +
    " STUDENTS AT HOGWARTS SCHOOL OF WITCHCRAFT AND WIZARDRY";
    
String.prototype.groupByWord = function () {
    let group = {};
    this.split(" ").forEach(word => {
        if (group[word]) {
            group[word] = group[word] + 1;
        } else {
            group[word] = 1;
        }
    });
    return group;
};


let groupOfWordsByCount = snippet.groupByWord();
console.log(JSON.stringify(groupOfWordsByCount,null, 4))
...