Как подсчитать повторяющееся значение в массиве в javascript
В настоящее время у меня есть такой массив:
var uniqueCount = Array();
пройдя несколько шагов, мой массив выглядит так:
uniqueCount = [a,b,c,d,d,e,a,b,c,f,g,h,h,h,e,a];
как я могу подсчитать, сколько a,b, c есть в массиве? Я хочу иметь результат, как:
a = 3
b = 1
c = 2
d = 2
etc.
17 ответов:
function count() { array_elements = ["a", "b", "c", "d", "e", "a", "b", "c", "f", "g", "h", "h", "h", "e", "a"]; array_elements.sort(); var current = null; var cnt = 0; for (var i = 0; i < array_elements.length; i++) { if (array_elements[i] != current) { if (cnt > 0) { document.write(current + ' comes --> ' + cnt + ' times<br>'); } current = array_elements[i]; cnt = 1; } else { cnt++; } } if (cnt > 0) { document.write(current + ' comes --> ' + cnt + ' times'); } }
что-то вроде этого:
uniqueCount = ["a","b","c","d","d","e","a","b","c","f","g","h","h","h","e","a"]; var count = {}; uniqueCount.forEach(function(i) { count[i] = (count[i]||0) + 1;}); console.log(count);используйте простой цикл for вместо forEach, если вы не хотите, чтобы это сломалось в старых браузерах.
я наткнулась на этот (очень старый) вопрос. Интересно, что самое очевидное и элегантное решение (imho) отсутствует: массив.прототип.сводить.(..). Все основные браузеры поддерживают эту функцию примерно с 2011 года (IE) или даже раньше (все остальные):
var arr = ['a','b','c','d','d','e','a','b','c','f','g','h','h','h','e','a']; var map = arr.reduce(function(prev, cur) { prev[cur] = (prev[cur] || 0) + 1; return prev; }, {}); // map is an associative array mapping the elements to their frequency: document.write(JSON.stringify(map)); // prints {"a": 3, "b": 2, "c": 2, "d": 2, "e": 2, "f": 1, "g": 1, "h": 3}
Я думаю, что это самый простой способ подсчета вхождений с одинаковым значением в массиве.
var a = [true, false, false, false]; a.filter(function(value){ return value === false; }).length
вы можете решить ее без использования каких-либо for / while циклов ou forEach.
function myCounter(inputWords) { return inputWords.reduce( (countWords, word) => { countWords[word] = ++countWords[word] || 1; return countWords; }, {}); }надеюсь, что это поможет вам!
одна строка на основе функции уменьшения массива
const uniqueCount = ["a", "b", "c", "d", "d", "e", "a", "b", "c", "f", "g", "h", "h", "h", "e", "a"]; const distribution = uniqueCount.reduce((acum,cur) => Object.assign(acum,{[cur]: (acum[cur] | 0)+1}),{}); console.log(JSON.stringify(distribution,null,2));
вы можете сделать что-то вроде этого:
uniqueCount = ['a','b','c','d','d','e','a','b','c','f','g','h','h','h','e','a']; var map = new Object(); for(var i = 0; i < uniqueCount.length; i++) { if(map[uniqueCount[i]] != null) { map[uniqueCount[i]] += 1; } else { map[uniqueCount[i]] = 1; } }теперь у вас есть карта со всеми символами count
вы можете иметь объект, который содержит графы. Пройдите по списку и увеличьте количество для каждого элемента:
var counts = {}; uniqueCount.forEach(function(element) { counts[element] = (counts[element] || 0) + 1; }); for (var element in counts) { console.log(element + ' = ' + counts[element]); }
var uniqueCount = ['a','b','c','d','d','e','a','b','c','f','g','h','h','h','e','a']; // here we will collect only unique items from the array var uniqueChars = []; // iterate through each item of uniqueCount for (i of uniqueCount) { // if this is an item that was not earlier in uniqueCount, // put it into the uniqueChars array if (uniqueChars.indexOf(i) == -1) { uniqueChars.push(i); } } // after iterating through all uniqueCount take each item in uniqueChars // and compare it with each item in uniqueCount. If this uniqueChars item // corresponds to an item in uniqueCount, increase letterAccumulator by one. for (x of uniqueChars) { let letterAccumulator = 0; for (i of uniqueCount) { if (i == x) {letterAccumulator++;} } console.log(`${x} = ${letterAccumulator}`); }
сочетание хороших ответов:
var count = {}; var arr = ['a', 'b', 'c', 'd', 'd', 'e', 'a', 'b', 'c', 'f', 'g', 'h', 'h', 'h', 'e', 'a']; var iterator = function (element) { count[element] = (count[element] || 0) + 1; } if (arr.forEach) { arr.forEach(function (element) { iterator(element); }); } else { for (var i = 0; i < arr.length; i++) { iterator(arr[i]); } }надеюсь, что это полезно.
public class CalculateCount { public static void main(String[] args) { int a[] = {1,2,1,1,5,4,3,2,2,1,4,4,5,3,4,5,4}; Arrays.sort(a); int count=1; int i; for(i=0;i<a.length-1;i++){ if(a[i]!=a[i+1]){ System.out.println("The Number "+a[i]+" appears "+count+" times"); count=1; } else{ count++; } } System.out.println("The Number "+a[i]+" appears "+count+" times"); }}
дубликаты в массиве, содержащем алфавиты:
var arr = ["a", "b", "a", "z", "e", "a", "b", "f", "d", "f"], sortedArr = [], count = 1; sortedArr = arr.sort(); for (var i = 0; i < sortedArr.length; i = i + count) { count = 1; for (var j = i + 1; j < sortedArr.length; j++) { if (sortedArr[i] === sortedArr[j]) count++; } document.write(sortedArr[i] + " = " + count + "<br>"); }дубликаты в массиве, содержащем числа:
var arr = [2, 1, 3, 2, 8, 9, 1, 3, 1, 1, 1, 2, 24, 25, 67, 10, 54, 2, 1, 9, 8, 1], sortedArr = [], count = 1; sortedArr = arr.sort(function(a, b) { return a - b }); for (var i = 0; i < sortedArr.length; i = i + count) { count = 1; for (var j = i + 1; j < sortedArr.length; j++) { if (sortedArr[i] === sortedArr[j]) count++; } document.write(sortedArr[i] + " = " + count + "<br>"); }
С помощью массива.карту мы можем уменьшить цикл, см. Это на jsfiddle
function Check(){ var arr = Array.prototype.slice.call(arguments); var result = []; for(i=0; i< arr.length; i++){ var duplicate = 0; var val = arr[i]; arr.map(function(x){ if(val === x) duplicate++; }) result.push(duplicate>= 2); } return result; }Для Теста:
var test = new Check(1,2,1,4,1); console.log(test);
var string = ['a','a','b','c','c','c','c','c','a','a','a']; function stringCompress(string){ var obj = {},str = ""; string.forEach(function(i) { obj[i] = (obj[i]||0) + 1; }); for(var key in obj){ str += (key+obj[key]); } console.log(obj); console.log(str); }stringCompress(string) /* Always open to improvement ,please share */
создать файл, например
demo.jsи запустить его в консоли с узломdemo.jsи вы получите вхождение элементов в виде матрицы.var multipleDuplicateArr = Array(10).fill(0).map(()=>{return Math.floor(Math.random() * Math.floor(9))}); console.log(multipleDuplicateArr); var resultArr = Array(Array('KEYS','OCCURRENCE')); for (var i = 0; i < multipleDuplicateArr.length; i++) { var flag = true; for (var j = 0; j < resultArr.length; j++) { if(resultArr[j][0] == multipleDuplicateArr[i]){ resultArr[j][1] = resultArr[j][1] + 1; flag = false; } } if(flag){ resultArr.push(Array(multipleDuplicateArr[i],1)); } } console.log(resultArr);вы получите результат в консоли, как показано ниже:
[ 1, 4, 5, 2, 6, 8, 7, 5, 0, 5 ] . // multipleDuplicateArr [ [ 'KEYS', 'OCCURENCE' ], // resultArr [ 1, 1 ], [ 4, 1 ], [ 5, 3 ], [ 2, 1 ], [ 6, 1 ], [ 8, 1 ], [ 7, 1 ], [ 0, 1 ] ]
Это мой фиктивный ответ, который любой может понять!
const duplicates = function(arr){ const dic = [] arr.forEach(function(val){ if(!!dic[val]){ dic[val]++ }else{ dic[val] = 1 } }); return dic }
Comments