В настоящее время у меня есть такой массив:
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
и т.п.
javascript
arrays
Detno29
источник
источник
{}
не функциональное программированиеmap
.Ответы:
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'); } } count();
Демо скрипка
Вы также можете использовать функции высшего порядка для выполнения операции. Смотрите этот ответ
источник
for (var i = 0; i <= array_elements.length; i++) {
или<=
вместо<
.var counts = {}; your_array.forEach(function(x) { counts[x] = (counts[x] || 0)+1; });
источник
counts[x] || 0
возвращает значение,counts[x]
если оно установлено, в противном случае0
. Затем просто добавьте один и снова установите его в объекте, и счет будет выполнен.reduce
:var counts = your_array.reduce((map, val) => {map[val] = (map[val] || 0)+1; return map}, {} );
Что-то вроде этого:
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, если вы не хотите, чтобы это прерывалось в старых браузерах.
источник
uniqueCount.forEach(function(value, index) { count[value] = (count[value] || 0) + 1; });
Я наткнулся на этот (очень старый) вопрос. Интересно, что отсутствует наиболее очевидное и элегантное решение (imho): Array.prototype.reduce (...) . Все основные браузеры поддерживают эту функцию примерно с 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}
источник
Одна строка на основе функции уменьшения массива
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));
источник
Чем проще, тем лучше, одна переменная, одна функция :)
const counts = arr.reduce((acc, value) => ({ ...acc, [value]: (acc[value] || 0) + 1 }), {});
источник
Я думаю, что это самый простой способ подсчета вхождений с одинаковым значением в массиве.
var a = [true, false, false, false]; a.filter(function(value){ return value === false; }).length
источник
// Initial array let array = ['a', 'b', 'c', 'd', 'd', 'e', 'a', 'b', 'c', 'f', 'g', 'h', 'h', 'h', 'e', 'a']; // Unique array without duplicates ['a', 'b', ... , 'h'] let unique = [...new Set(array)]; // This array counts duplicates [['a', 3], ['b', 2], ... , ['h', 3]] let duplicates = unique.map(value => [value, array.filter(str => str === value).length]);
источник
Похоже, что никто из ответивших не использует для этого
Map()
встроенные средства, которые, как правило, я использую в сочетании сArray.prototype.reduce()
:const data = ['a','b','c','d','d','e','a','b','c','f','g','h','h','h','e','a']; const result = data.reduce((a, c) => a.set(c, (a.get(c) || 0) + 1), new Map()); console.log(...result);
Nb, вам придется использовать полифил,
Map()
если вы хотите использовать его в старых браузерах.источник
get
иset
функции исходят отMap
объекта. Но начальный аккумулятор не является объектом Map, так почему сокращенная версия редуктора принимает его?Map
объект; см. второй аргумент сокращения.Map.prototype.set
возвращает объект карты иMap.prototype.get
возвращаетundefined
значение любого предоставленного ему ключа. Это позволяет нам получить текущий счетчик каждой буквы (или,0
если он не определен), затем увеличить его на единицу, а затем установить счетчик этой буквы на новый счетчик, который возвращает карту и становится новым значением аккумулятора.У вас может быть объект, содержащий счетчики. Обойдите список и увеличьте счетчик для каждого элемента:
var counts = {}; uniqueCount.forEach(function(element) { counts[element] = (counts[element] || 0) + 1; }); for (var element in counts) { console.log(element + ' = ' + counts[element]); }
источник
counts[element] || 0
?counts[element]
возвращается,undefined
так как свойство еще не имеет значения. Если вы затем попытаетесь добавитьundefined + 1
, вы получите NaN .(count[element] || 0)
Заменитundefined
с0
таким добавлением1
производит1
вместоNaN
. ECMAScript 2020 добавляет нулевой оператор объединения,??
который делает то же самое, но немного более явно, поскольку он использует второе значение, когда первое -undefined
(илиnull
). Та версия была бы(counts[element] ?? 0) + 1
.Вы можете решить эту проблему без использования каких-либо циклов for / while или forEach.
function myCounter(inputWords) { return inputWords.reduce( (countWords, word) => { countWords[word] = ++countWords[word] || 1; return countWords; }, {}); }
Надеюсь, это вам поможет!
источник
// new example. var str= [20,1,-1,2,-2,3,3,5,5,1,2,4,20,4,-1,-2,5]; function findOdd(para) { var count = {}; para.forEach(function(para) { count[para] = (count[para] || 0) + 1; }); return count; } console.log(findOdd(str));
источник
Вы можете сделать что-то подобное:
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; } }
теперь у вас есть карта с подсчетом всех символов
источник
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 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>"); }
источник
var testArray = ['a', 'b', 'c', 'd', 'd', 'e', 'a', 'b', 'c', 'f', 'g', 'h ',' h ',' h ',' e ',' a '];
var newArr = []; testArray.forEach((item) => { newArr[item] = testArray.filter((el) => { return el === item; }).length; }) console.log(newArr);
источник
uniqueCount = ["a","b","a","c","b","a","d","b","c","f","g","h","h","h","e","a"]; var count = {}; uniqueCount.forEach((i) => { count[i] = ++count[i]|| 1}); console.log(count);
источник
упрощенный файл Sheet.js answare
var counts = {}; var aarr=['a','b','a']; aarr.forEach(x=>counts[x]=(counts[x] || 0)+1 ); console.log(counts)
источник
Это просто в javascript, используя метод уменьшения массива:
const arr = ['a','d','r','a','a','f','d']; const result = arr.reduce((json,val)=>({...json, [val]:(json[val] | 0) + 1}),{}); console.log(result) //{ a:3,d:2,r:1,f:1 }
источник
Сочетание хороших ответов:
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"); }
}
источник
Используя array.map, мы можем сократить цикл, см. Это на 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 ] ]
источник
Самый быстрый способ:
Вычислительная сложность O (n).
function howMuchIsRepeated_es5(arr) { const count = {}; for (let i = 0; i < arr.length; i++) { const val = arr[i]; if (val in count) { count[val] = count[val] + 1; } else { count[val] = 1; } } for (let key in count) { console.log("Value " + key + " is repeated " + count[key] + " times"); } } howMuchIsRepeated_es5(['a','b','c','d','d','e','a','b','c','f','g','h','h','h','e','a']);
Самый короткий код:
Используйте ES6.
function howMuchIsRepeated_es6(arr) { // count is [ [valX, count], [valY, count], [valZ, count]... ]; const count = [...new Set(arr)].map(val => [val, arr.join("").split(val).length - 1]); for (let i = 0; i < count.length; i++) { console.log(`Value ${count[i][0]} is repeated ${count[i][1]} times`); } } howMuchIsRepeated_es6(['a','b','c','d','d','e','a','b','c','f','g','h','h','h','e','a']);
источник
var arr = ['a','d','r','a','a','f','d']; //call function and pass your array, function will return an object with array values as keys and their count as the key values. duplicatesArr(arr); function duplicatesArr(arr){ var obj = {} for(var i = 0; i < arr.length; i++){ obj[arr[i]] = []; for(var x = 0; x < arr.length; x++){ (arr[i] == arr[x]) ? obj[arr[i]].push(x) : ''; } obj[arr[i]] = obj[arr[i]].length; } console.log(obj); return obj; }
источник
Объявите объект,
arr
содержащий уникальный набор ключей. Заполнитеarr
, пройдя по массиву один раз, используя карту. Если ключ не был ранее найден, добавьте ключ и присвойте нулевое значение. На каждой итерации увеличивайте значение ключа.Данный testArray:
var testArray = ['a','b','c','d','d','e','a','b','c','f','g','h','h','h','e','a'];
решение:
var arr = {}; testArray.map(x=>{ if(typeof(arr[x])=="undefined") arr[x]=0; arr[x]++;});
JSON.stringify(arr)
выведет{"a":3,"b":2,"c":2,"d":2,"e":2,"f":1,"g":1,"h":3}
Object.keys(arr)
вернется["a","b","c","d","e","f","g","h"]
Чтобы найти вхождения любого элемента, например, b
arr['b']
выведет2
источник
Применение:
КОД:
function getUniqueDataCount(objArr, propName) { var data = []; objArr.forEach(function (d, index) { if (d[propName]) { data.push(d[propName]); } }); var uniqueList = [...new Set(data)]; var dataSet = {}; for (var i=0; i < uniqueList.length; i++) { dataSet[uniqueList[i]] = data.filter(x => x == uniqueList[i]).length; } return dataSet; }
Фрагмент
var data= [ {a:'you',b:'b',c:'c',d:'c'}, {a: 'you', b: 'b', c: 'c', d:'c'}, {a: 'them', b: 'b', c: 'c', d:'c'}, {a: 'them', b: 'b', c: 'c', d:'c'}, {a: 'okay', b: 'b', c: 'c', d:'c'}, {a: 'okay', b: 'b', c: 'c', d:'c'}, ]; console.log(getUniqueDataCount(data, 'a')); function getUniqueDataCount(objArr, propName) { var data = []; objArr.forEach(function (d, index) { if (d[propName]) { data.push(d[propName]); } }); var uniqueList = [...new Set(data)]; var dataSet = {}; for (var i=0; i < uniqueList.length; i++) { dataSet[uniqueList[i]] = data.filter(x => x == uniqueList[i]).length; } return dataSet; }
источник