早上好,我试图计算数组中某个特定元素出现的次数。我试过了,但是下面的代码即使它不止一次出现,也只计数一个数组(这不是问题)。我希望它返回每个元素出现的时间。例如
let arr = [1, 3, 2, 1];
这应该返回
{1:2} {3:1} {2:1}
我的代码返回3(因为它不会重复计数一次)
我该怎么办?
下面是我的代码
function numberCount(number) {
let count = 0;
number.forEach(function (item, index) {
if (number.indexOf(item) == index) count++;
});
console.log(count);
}
答案 0 :(得分:3)
在number
上进行迭代(最好将其称为arr
时,它是一个数组,而不是一个数字),请使用一个对象来跟踪到目前为止每个数字出现的次数。然后,遍历结果对象的entries
以创建所需的对象:
let arr = [1, 3, 2, 1];
function numberCount(arr) {
let count = 0;
const obj = arr.reduce((a, num) => {
a[num] = (a[num] || 0) + 1;
return a;
}, {});
return Object.entries(obj).map(([key, val]) => ({ [key]: val }));
}
console.log(numberCount(arr));
数字键在对象中始终按数字顺序排列。如果您希望输出中的对象以 inserttion 的顺序出现(例如,键为3
的对象位于键为2
的对象之前),请使用{{1 }}而不是对象(映射键将按插入顺序进行迭代):
Map
答案 1 :(得分:1)
您应该filter
列出这些数字,然后使用length
:
let arr = [1, 3, 2, 1];
function itemCount(array) {
var sorted = array.sort()
var uniqueCount = sorted.filter((v, i, a) => a.indexOf(v) == i);
var count = [];
uniqueCount.forEach(item => {
var itemCount = sorted.filter(e => e == item).length;
count.push({[item]: itemCount});
});
return count;
}
console.log(itemCount(arr));
答案 2 :(得分:0)
我建议不要重新发明轮子,而是使用已经具有此功能的lodash。使用countBy()
,您将获得一个对象,然后可以将其转换为所需的结果。例如:
const arr = [1, 3, 2, 1]
const count = _.countBy(arr)
const result = Object.keys(count).map(k => ({ [k]: count[k] }))
console.log(result)
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.11/lodash.min.js"></script>