【问题标题】:Count occurrences of array elements with JavaScript [duplicate]使用 JavaScript 计算数组元素的出现次数 [重复]
【发布时间】:2015-04-14 18:34:57
【问题描述】:

我有这个长度为 129 的 JavaScript 数组。

var fullnames = [Karri, Ismo, Grigori, Ahmed, Roope, Arto .....]

我想知道这些名字在一个数组中出现了多少次,并将这些信息存储在一个数组中,如下所示:

var counter = [2, 5, 7, ..]

Karri 在fullnames 数组中出现了 2 次,Ismo 出现了 5 次等等。关于如何做到这一点的任何想法?

【问题讨论】:

  • 你有没有尝试过?
  • 最直接的答案可能是您的问题集问题正在寻找的内容:使用reduce。试一试,如果你不明白,把你的作品发回这里。
  • 减少是不够的,需要有某种嵌套迭代。
  • @dandavis 我没有给出完整的答案,因此发表了评论。这是为了让 OP 继续下去,这样他们就可以尝试自己解决它。
  • grr,错误关闭:我想你想计算一个未显示的数组? var fullNames = ['Karri', 'Ismo', 'Grigori', 'Ahmed'], counts=[], whole=['Karri', 'Ahmed', 'Ahmed', 'Ismo', 'Grigori', 'Ahmed','Karri', 'Ismo', 'Grigori', 'Ahmed', 'Ismo', 'Grigori' ] whole.forEach(function(name){ var slot=fullNames.indexOf(name); counts[slot]=counts[slot]||0; counts[slot]++; }); counts // == [2, 3, 3, 4]

标签: javascript arrays


【解决方案1】:

这是我能想到的最好且最简单的方法:

var fullnames = ["Karri", "Ismo", "Grigori", "Ahmed", "Roope", "Ahmed", "Karri", "Arto", "Ahmed"];
var counts = {};

for (var i = 0; i < fullnames.length; i++)
{
    if (!counts.hasOwnProperty(fullnames[i]))
    {
        counts[fullnames[i]] = 1;
    }
    else 
    {
        counts[fullnames[i]]++;
    }
}

console.log(counts);

Original Fiddle

使用数组来存储计数没有多大意义,所以我使用了一个对象。

【讨论】:

  • 那么要搜索的数据数组在哪里插入呢?
  • @dandavis 对不起,你的意思是什么?
  • 我认为他想在一个大的名字数组中计算每个名字,然后返回一个有序的计数数组,其顺序与要在大数组中搜索的名字列表相同(未显示)
  • @dandavis 当然,但这并没有多大意义(至少 OP 没有向我们展示这方面的目的)。看this fiddle 我是从techfoobar 示例中制作的。如果您在序列中添加一个唯一的字符串,它会分解结果。除非您对每个字符串的每个位置重复计数以知道哪个计数相对于哪个字符串,否则我认为更复杂。
  • 好吧,我想的方式可以解释所需的有序数组输出,在那种情况下放弃索引是没有意义的。也许这只是一个糟糕的问题......
【解决方案2】:

我假设fullnames 是字符串数组。如果是这样,您可以这样做:

var occurences = { };
for (var i = 0; i < fullnames.length; i++) {
    if (typeof occurences[fullnames[i]] == "undefined") {
        occurences[fullnames[i]] = 1;
    } else {
        occurences[fullnames[i]]++;
    }
}

console.log(occurences); // Prints out something like: {"Karri": 2, "Ismo": 5, ...}

【讨论】:

    【解决方案3】:
    var fullnames = ['Karri', 'Ismo', 'Grigori', 'Karri', 'Ismo', 'Grigori', 'Grigori', 'Karri', 'Ismo', 'Grigori', 'Grigori'];
    var counts = [];
    fullnames.forEach(function(_item) {
        if(typeof counts[_item] === 'undefined') counts[_item] = 1;
        else counts[_item]++;
    });
    var result = [];
    for(i in counts) result.push(counts[i]);
    console.log(result);
    
    // outputs [3, 3, 5]
    

    【讨论】:

    • 我认为将结果存储在数组中没有多大意义。如果您在第二个 Karri 之后有一个不重复的不同字符串怎么办?什么计数是相对的? jsfiddle.net/dr75vafL
    猜你喜欢
    • 1970-01-01
    • 2012-06-11
    • 1970-01-01
    • 1970-01-01
    • 2019-09-24
    • 2022-11-30
    • 2015-12-11
    • 2016-04-21
    • 1970-01-01
    相关资源
    最近更新 更多