【问题标题】:Count number of ocurrences in an array [duplicate]计算数组中出现的次数[重复]
【发布时间】:2015-07-24 13:37:27
【问题描述】:

我很想知道数组中每个对象出现了多少次。

这就是我想要做的事情,并与我认为的一些伪代码混合在一起。

var myArray = [1,2,3,1,1,3,4];

for (i = 0; i < myArray.length; i++) {
    if (myArray[i].AlreadyExistsInAVariable) {
        var[i]+ = 1;
    }
    else {
        CreateAnewVar();
    }
}

var one = 3;
var two = 1;
var three = 2;
var four = 1;

【问题讨论】:

  • 还要记住,数组中对象的数量以及它们的类型数量会不断变化。
  • 几乎是重复的:stackoverflow.com/q/5667888/588079。然而,解决 Fyxerz 指出的问题会使其重复。
  • 你为什么不实现它并测试它并改进它,直到你自己完成它?
  • 我认为你需要这样的东西:jsfiddle.net/fh0pzxeu

标签: javascript jquery arrays for-loop


【解决方案1】:

您应该使用对象来计算数组中数字的出现次数,而不是使用变量。

var myArray = [1,2,3,1,1,3,4];
var counter = {};
for (i = 0; i < myArray.length; i++) {
    if (myArray.indexOf(myArray[i])>=0) {
        if(!counter[myArray[i]]){
           counter[myArray[i]]=1;
        }
        else{
           counter[myArray[i]]++;  
        }    
    }
}
console.log(counter);

【讨论】:

  • 为什么这个答案被否决。感谢您在投票前提供理由
  • 这正是我的做法。但我认为您不需要if (myArray.indexOf(myArray[i])&gt;=0) 这行代码,它只是多余的。
  • SO 已经被这类问题淹没了!此外,在将其发布到 SO 之前,OP 似乎没有做出任何努力来至少进行搜索。
  • @Vicky:那是否决投票的正当理由吗?
  • 我相信人们只会在答案错误或无关紧要时才会投反对票。像这样无缘无故地投票会阻止人们回答或帮助问卷,我觉得这不正确。
【解决方案2】:

这个怎么样:

var myArray = [1,2,3,1,1,3,4];

var count = myArray.reduce(function(n, val) {
    return n + (val === 1);
}, 0);

console.log(count);

编辑:

为了计算数组中每个元素的出现次数,我会这样做:

var result = {};

[1,2,3,1,1,3,4].forEach(function(e, i) {
     result[e] = result[e] + 1 || 1;
});

alert(JSON.stringify(result, null, "\t"));

【讨论】:

  • 我什至无法理解这是想做什么......
  • 好吧,从技术上讲,它会计算数字 1 的出现次数,但即便如此,也只是由于 JavaScript 中奇怪的类型强制行为导致 &lt;number&gt; + true 等于 &lt;number&gt; + 1
  • 我没有正确阅读问题。以为OP想要计算单个元素的出现。仔细解释一下你的意思@jmar777? === 不是在没有强制的情况下进行比较吗?
  • 是的,=== 执行严格的相等比较,但比较的结果是布尔值。因此,n + (val === 1) 表达式会产生 &lt;number&gt; + &lt;boolean&gt; 表达式。我不知道这是否是设计使然,因为您的解决方案在技术上有效(!!),但这仅仅是因为在 JavaScript 中 &lt;number&gt; + true 导致 &lt;number&gt; + 1 为结果。
【解决方案3】:

您实际上不能像那样创建新的变量绑定。但是,您可以为对象动态添加新属性,这可能更适合此问题。这是一个计算该数组中数字出现次数的示例:

var myArray = [1,2,3,1,1,3,4];

var counts = myArray.reduce(function(result, item) {
    result[item] || (result[item] = 0);
    result[item]++;
    return result;
}, {});

console.log(counts);

在此处查看实际操作:http://jsbin.com/huduroyite/edit?js,console

【讨论】:

  • 不胜感激对downvote的解释......
  • 这个答案有效,似乎是解决我的问题的好方法,比使用数组更好。但是,我真的不明白你是怎么做到的……有没有什么链接可以让我更多地了解 reduce 中的功能?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-11
  • 2012-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-24
相关资源
最近更新 更多