使用具有一个参数的函数计算数组中元素的重复次数

时间:2019-02-19 04:11:28

标签: javascript arrays function object

早上好,我试图计算数组中某个特定元素出现的次数。我试过了,但是下面的代码即使它不止一次出现,也只计数一个数组(这不是问题)。我希望它返回每个元素出现的时间。例如

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);
}

3 个答案:

答案 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>