С помощью регулярного выражения и Greasemonkey у меня есть массив результатов, который выглядит примерно так: choice1, choice2, choice3, choice3, choice1, etc..
Мой вопрос в том, как мне подсчитать варианты, чтобы я знал, сколько раз choice1 находится в массиве, choice2 находится в массиве и т.д., если я не знаю точно, сколько вариантов есть или что они есть.
Конечная цель - создать сценарий Greasemonkey, который хранит количество голосов, полученных каждым выбором на нескольких страницах (возможно, с использованием gm_setvalue, хотя я открыт для других идей).
Спасибо!



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Не уверен на 100%, что вы ищете, но я думаю, что это он.
// Original data
var choices = [
"choice 1",
"choice 1",
"choice 2",
"choice 3",
"choice 3",
"choice 3",
"choice 3",
"choice 3",
"choice 3",
"choice 4",
"choice 4",
"choice 4"];
//Create the results array
var result = new Object();
for (var choice in choices) {
if (result[choices[choice]] === undefined)
result[choices[choice]] = 1;
else
result[choices[choice]]++;
}
//Print result
var str = "";
for (var item in result)
str += item + ": " + result[item] + "<br />";
document.getElementById("resultDiv").innerHTML = str;
Выход:
choice 1: 2
choice 2: 1
choice 3: 6
choice 4: 3
- Конструкция for..in может работать не так, как вы ожидали, в массиве choices. - Оператор if действительно должен проверять === undefined, а не полагаться на истинность (undefined == null).
Один из способов - перебирать варианты и увеличивать счетчик, связанный с каждым уникальным выбором в свойстве объекта.
Пример:
var choiceCounts = {};
for (var iLoop=0; iLoop < aChoices.length; iLoop++) {
var keyChoice = aChoices[iLoop];
if (!choiceCounts[keyChoice]) {
choiceCounts[keyChoice] = 1;
} else {
choiceCounts[keyChoice]++;
} //if
} //for
Затем у вас есть объект со свойствами, равными тому, сколько раз свойство существовало в массиве.
Сначала отсортируйте массив, тогда вы можете выполнить однократное сканирование для подсчета вхождений (аналогично предложению Райана выше).
Несколько предложений: - Обратите внимание, что переменная "result" действительно должна быть объектом, а не массивом, поскольку использование свойств объекта в массиве часто приводит к путанице. - При использовании конструкции for..in рекомендуется использовать hasOwnProperty.