【问题标题】:categorise an element in Array for loop javascript为循环javascript对数组中的元素进行分类
【发布时间】:2018-08-14 09:21:26
【问题描述】:

我是 JS 新手

我有一个数组和一个相同数组的对象。

我想获取特定类别的总数。

例如:

1.Critical: from 30-45
2.High: from 16-27
3.Medium: from 5-15 
4.Low:from 3-4

我得到的数组布局有两种格式。

从浏览器:

    slect_score
    [{…}]0:
     4: 1
     5: 3
     15: 6
     20: 1
     30: 2
     45:2
     __proto__: Objectlength: 1__proto__: Array(0)

从浏览器:

    score_map
{4: 1, 5: 3, 15: 6, 20: 1, 30: 2, 45: 2}

__proto__:Object

All in All,我想对数字进行分组,得到每个类别的出现总数。

对于上面的例子:我应该有:

            1.Critical: 4
            2.High: 1
            3.Medium: 9
            4.Low: 1

这是我的代码:我正在尝试将其插入到 Django 模板中:

        var score = document.getElementById("score").innerHTML;
        var score_array = [score.split(",").map(Number)];
        var score_array_a = score_array[score_array.length -1];
        var score_array_b = score_array_a.slice(0, -1);
        var score_sum = score_array_b.reduce(function(a, b){ return a +                         
        b;}, 0);
        var score_avg = parseFloat(score_sum / score_array_b.length);




        var score_map = score_array_b.reduce(function(obj, b) {
          obj[b] = ++obj[b] || 1;
          return obj;
        }, {});

        var slect_score = new Array(score_map);

在我的 Django 模板中:

    <p  id=score>
    {% for asset in self.get_children %}{% for finding in        
     asset.get_children.specific %}
    {% with finding.Identification|mul:Reconize                 
    as ID_REC %}{{ID_REC|mul:Impact}},{% endwith %}{% 
    endfor %}{% endfor %}
    </p>

Django Elements 主要用于计算并获取每个页面的数量并进行计算

答案 Bergur 先生的代码。 以及我获得每个类别总数的方法。
    var score = document.getElementById("vul_score").innerHTML;
    var score_array = [score.split(",").map(Number)];
    var score_array_a = score_array[score_array.length -1];
    var score_array_b = score_array_a.slice(0, -1);
    var score_sum = score_array_b.reduce(function(a, b){ return a +         
    b;}, 0);
    var score_avg = parseFloat(score_sum / score_array_b.length);



    var score_map = score_array_b.reduce(function(obj, b) {
      obj[b] = ++obj[b] || 1;
      return obj;
    }, {})


    var scoore = Object.entries(score_map).map(e => Object.assign(e, {         
    0: +e[0]                 }));

    const scores = [{
      name: 'critical',
      low: 30,
      high: 45,
      count: 0
    },{
      name: 'high',
      low: 16,
      high: 27,
      count: 0
    },{
      name: 'medium',
      low: 5,
      high: 15,
      count: 0
    },{
      name: 'low',
      low: 3,
      high: 4,
      count: 0
    }]

    const score_map_keys = Object.keys(score_map);

    scores.forEach(s  => {
      score_map_keys.forEach(key => {
        let count = score_map[key];
        if (key >= s.low && key <= s.high) {
          s.count = s.count+count
        }
      });
    })

为了得到我所做的每个类别的总数:

  [scores[0].count, scores[1].count, scores[2].count, scores[3].count]

我真的要感谢 Bergur 先生。

【问题讨论】:

  • 请发布您的代码
  • 欢迎来到 Stack Overflow!请查看tour,环顾四周,并通读help center,尤其是How do I ask a good question? 请发布定义您的对象的实际JavaScript代码,而不是在您转储它们时浏览器控制台向您显示的文本渲染出去。实际代码更清晰,让我们更容易为您提供帮助。
  • 另外,即使您是新手,最好的办法是进行研究,search 了解 SO 的相关主题,然后尝试一下。 如果在经过更多研究和搜索后您遇到困难并且无法摆脱困境,请发布您的尝试minimal reproducible example,并具体说明您遇到困难的地方。人们会很乐意提供帮助。
  • 如果有人有 28 会怎样?高是 27,但关键从 30 开始
  • 计算不能是28,它有一个固定的数字。用于计算目的。

标签: javascript arrays object


【解决方案1】:

有几种方法可以做到这一点。这是一种方法。

1- 你有评分系统,但你需要以代码可以读取它的方式排列它。

一种方法是:

const scores = [{
  name: 'critical',
  low: 30,
  high: 45,
  count: 0
},{
  name: 'high',
  low: 16,
  high: 27,
  count: 0
},{
  name: 'medium',
  low: 5,
  high: 15,
  count: 0
},{
  name: 'low',
  low: 3,
  high: 4,
  count: 0
}]

这里有一个对象数组。每个对象都有 4 个属性:名称、允许的最高值、允许的最低值和当前计数。稍后我们将在代码中对其进行修改。

2- 我们可以使用 .forEach 循环遍历该数组

scores.forEach(scoreObject => {
  console.log('This is '+ scoreObject.name)
  console.log('Highest value is '+ scoreObject.high)
  console.log('Lowest value is '+ scoreObject.low)
})

3- 您也有每个分数的计数,但您必须能够循环遍历它以将其全部加起来。这是一个 javascript 对象,循环遍历 javascript 对象的最佳方法是使用 Object.keys。

const score_map = {
  4: 1,
  5: 3,
  15: 6,
  20: 1,
  30: 2,
  45: 2
}

const score_map_keys = Object.keys(score_map);

4- 我们可以循环遍历所有的分数。

score_map_keys.forEach(key => {
  let count = score_map[key];
  console.log('Key ' + key + ' has value ' + count);
});

5- 现在我们可以把它们放在一起了。对于每个分数,我们需要遍历计数并将它们全部相加。

scores.forEach(scoreObject  => {
  console.log('Looking at ' + scoreObject.name);
  score_map_keys.forEach(key => {    
    let count = score_map[key];   
    if (key >= scoreObject.low && key <= scoreObject.high) {
      console.log(key + ' matches the allowed range');
      scoreObject.count = scoreObject.count+count
    }
  });
})

console.log(scores);

你可以在这个 jsfiddle 中找到工作代码:https://jsfiddle.net/j6734vtq/24/

打开控制台(ctr+shift+i)并按运行。

【讨论】:

  • Bergur,非常感谢您解释过程并提供易于理解的好答案。你太棒了。
猜你喜欢
  • 2016-05-28
  • 2018-07-18
  • 2017-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多