【问题标题】:Count number of entries of a minimum or maximum value of a parameter in Javascript计算Javascript中参数的最小值或最大值的条目数
【发布时间】:2021-05-09 06:47:06
【问题描述】:

我想计算 JS 数组中最小值或最大值的出现次数,如果出现次数超过 2(示例),则从原始数组中删除元素。例如,我有以下对象:

let data = [
    {name: 'DataSet01', Severity:'5'},
    {name: 'DataSet02', Severity:'3'},
    {name: 'DataSet03', Severity:'2'},
    {name: 'DataSet04', Severity:'2'},
    {name: 'DataSet05', Severity:'3'}
    {name: 'DataSet06', Severity:'2'}
];

这里,严重性是关键,它的值“2”是所有值中的最小值,它发生了 3 次,我想从原始数组(数据)中删除所有严重性为 2 的条目。

所以更新后的对象应该是这样的:

let finaldata = [
    {name: 'DataSet01', Severity:'5'},
    {name: 'DataSet02', Severity:'3'},
    {name: 'DataSet05', Severity:'3'}
];

到目前为止,我尝试使用过滤器来找到最小值,切片但无法在这个上获得所需的结果。希望有人可以帮助我。

【问题讨论】:

    标签: javascript arrays json object


    【解决方案1】:
    • 使用Math.maxMath.min 找出最大和最小的服务器。

    • 然后使用最大和最小严重性在data 中找到它们的出现。

    • 如果这些值大于2,则过滤data

    const 
      data=[{name:"DataSet01",Severity:"5"},{name:"DataSet02",Severity:"3"},{name:"DataSet03",Severity:"2"},{name:"DataSet04",Severity:"2"},{name:"DataSet05",Severity:"3"},{name:"DataSet06",Severity:"2"}],
      maxSeverity = String(Math.max(...data.map((o) => o.Severity))),
      minSeverity = String(Math.min(...data.map((o) => o.Severity))),
      numMaxSeverity = data.filter((o) => o.Severity === maxSeverity).length,
      numMinSeverity = data.filter((o) => o.Severity === minSeverity).length;
    
    let res = numMaxSeverity > 2 ? data.filter((o) => o.Severity !== maxSeverity): [...data];
    res = numMinSeverity > 2 ? data.filter((o) => o.Severity !== minSeverity) : res;
    
    console.log(res);

    【讨论】:

      【解决方案2】:

      使用single loop获取max and min value并将count of severity保存在数据数组中(代码优化);然后使用filter() 方法得到想要的输出。

      const data = [
          {name: 'DataSet01', severity:'6'},
          {name: 'DataSet11', severity:'6'},
          {name: 'DataSet10', severity:'6'},
          {name: 'DataSet09', severity:'5'},
          {name: 'DataSet02', severity:'3'},
          {name: 'DataSet03', severity:'2'},
          {name: 'DataSet04', severity:'2'},
          {name: 'DataSet05', severity:'3'},
          {name: 'DataSet06', severity:'2'}
      ];
      
      const filterData = (data) => {
        let maxValue = minValue = parseInt(data[0].severity);
        const countMap = new Map();
        for (const obj of data) {
          const objSeverity = parseInt(obj.severity);
          if (maxValue < objSeverity) {
            maxValue = objSeverity;
          }
          if (minValue > objSeverity) {
            minValue = objSeverity;
          }
          countMap.set(obj.severity, (countMap.get(obj.severity) ?? 0) + 1);
        }
      
        return data.filter(value => {
          const severity = parseInt(value.severity);
          if ((severity === maxValue || severity === minValue)
              && countMap.get(value.severity) > 2) {
            return false;
          }
          return true;
        });
      }
      
      console.log(filterData(data));

      【讨论】:

        【解决方案3】:

        还有另一种方法:

        const data = [ {name: 'DataSet01', Severity:'5'}, {name: 'DataSet02', Severity:'3'}, {name: 'DataSet03', Severity:'2'}, {name: 'DataSet04', Severity:'2'}, {name: 'DataSet05', Severity:'3'}, {name: 'DataSet06', Severity:'2'} ];
        
        function removeMinMax(arr,prop,n=1){
         const mm={m:["min","max"].map(mima=>""+Math[mima](...arr.map(d=>d[prop]))),c:[0,0,0]};
         arr.forEach(e=>mm.c[mm.m.indexOf(e[prop])+1]++); // count occurences
         mm.flt=mm.m.filter((_,i)=>mm.c[i+1]>=n); // decide whether to filter them out or not
         return arr.filter(e=>mm.flt.indexOf(e[prop])<0)
        } 
        console.log(removeMinMax(data,"Severity")); // remove all entries with MIN and MAX values
        console.log(removeMinMax(data,"Severity",2)); // remove them only when they occur at least twice

        函数removeMinMax(arr,prop,n) 需要过滤数组arr,扫描属性prop 的MIN 和MAX 值,以及n,即arr 中具有MIN 和MAX 值的元素的最小计数以便将它们删除。

        removeMinMax(arr,prop,n) 内,对象mm 用于控制过滤行为:

        • mm.m 是一个数组:[min_value, max_value]
        • mm.c 保存这些值的计数:
          [count_of NON_min_or_max_values, count_of MIN_values, count_of_MAX_values]
        • mm.flt实际 过滤器数组:
          只有具有mm.flt.indexOf(e.[prop])&lt;0arr 中的元素e 将保留在res 数组中。

        【讨论】:

          猜你喜欢
          • 2015-10-29
          • 2016-11-04
          • 1970-01-01
          • 2019-10-03
          • 2013-05-13
          • 1970-01-01
          • 2021-04-02
          • 2015-04-02
          • 1970-01-01
          相关资源
          最近更新 更多