使用 map/reduce/filter 优化 Javascript 脚本

标签 javascript

这是我的问题,我收到了这类 json 数据,但我事先不知道键 (unknownProperty#),但此数据数组中的不同对象具有相同的键。我需要做的是计算每个警报级别的数量(这些级别是固定的)。 这是我的最终结果应该是这样的

var result = { unknownProperty1: { unknown: 0, ok: 2, warning: 0, ko: 1 },
  unknownProperty2: { unknown: 0, ok: 0, warning: 2, ko: 1 },
  unknownProperty3: { unknown: 3, ok: 0, warning: 0, ko: 0 },
  unknownProperty4: { unknown: 0, ok: 0, warning: 3, ko: 0 },
  unknownProperty5: { unknown: 0, ok: 0, warning: 2, ko: 1 } }

我的脚本可以运行,但我想知道是否有任何方法可以使用 map/reduce/filter javascript 函数优化/清理它

const data = [
  {
    unknownProperty1: { alert: "ok", unusedItem1: "something" },
    unknownProperty2: { alert: "warning", unusedItem1: "something" },
    unknownProperty3: { alert: "unknown", unusedItem1: "something" },
    unknownProperty4: { alert: "warning", unusedItem1: "something" },
    unknownProperty5: { alert: "ko", unusedItem1: "something" }
  },
  {
    unknownProperty1: { alert: "ok", unusedItem1: "something" },
    unknownProperty2: { alert: "warning", unusedItem1: "something" },
    unknownProperty3: { alert: "unknown", unusedItem1: "something" },
    unknownProperty4: { alert: "warning", unusedItem1: "something" },
    unknownProperty5: { alert: "warning", unusedItem1: "something" }
  },
  {
    unknownProperty1: { alert: "ko", unusedItem1: "something" },
    unknownProperty2: { alert: "ko", unusedItem1: "something" },
    unknownProperty3: { alert: "unknown", unusedItem1: "something" },
    unknownProperty4: { alert: "warning", unusedItem1: "something" },
    unknownProperty5: { alert: "warning", unusedItem1: "something" }
  }
];

var result = new Object();
var dataKeys = data.map(function(element) {
  return Object.keys(element);
});
dataKeys[0].map(function(element) {
  result[element] = { unknown: 0, ok: 0, warning: 0, ko: 0 };
});
//At this point the result is like what we expect but no calculation has been made yet

//We then increment the right values
data.map(function(element) {
  for (var prop in element) {
    if (Object.prototype.hasOwnProperty.call(element, prop)) {
      // element correspond to the current object
      // prop corresponds to the name of the key, for example 'unknownProperty1'
      switch (element[prop].alert) {
        case "ok":
          result[prop].ok++;
          break;
        case "warning":
          result[prop].warning++;
          break;
        case "unknown":
          result[prop].unknown++;
          break;
        case "ko":
          result[prop].ko++;
          break;

        default:
          break;
      }
    }
  }
});
console.log(result);

最佳答案

缩减为由 unknownProperty_ 键索引的对象,遍历内部对象并在累加器上创建适当的键(如果它尚不存在),并将其值设置为 {未知:0,正常:0,警告:0,ko:0 。然后,在 unknownProperty 对象的每次迭代中,只需提取 alert 并递增 a[key][alert]:

const data = [
  {
    unknownProperty1: { alert: "ok", unusedItem1: "something" },
    unknownProperty2: { alert: "warning", unusedItem1: "something" },
    unknownProperty3: { alert: "unknown", unusedItem1: "something" },
    unknownProperty4: { alert: "warning", unusedItem1: "something" },
    unknownProperty5: { alert: "ko", unusedItem1: "something" }
  },
  {
    unknownProperty1: { alert: "ok", unusedItem1: "something" },
    unknownProperty2: { alert: "warning", unusedItem1: "something" },
    unknownProperty3: { alert: "unknown", unusedItem1: "something" },
    unknownProperty4: { alert: "warning", unusedItem1: "something" },
    unknownProperty5: { alert: "warning", unusedItem1: "something" }
  },
  {
    unknownProperty1: { alert: "ko", unusedItem1: "something" },
    unknownProperty2: { alert: "ko", unusedItem1: "something" },
    unknownProperty3: { alert: "unknown", unusedItem1: "something" },
    unknownProperty4: { alert: "warning", unusedItem1: "something" },
    unknownProperty5: { alert: "warning", unusedItem1: "something" }
  }
];

const dataByProperty = data.reduce((a, obj) => {
  Object.entries(obj).forEach(([key, { alert }]) => {
    if (!a[key]) {
      a[key] = { unknown: 0, ok: 0, warning: 0, ko: 0 };
    }
    a[key][alert]++;
  });
  return a;
}, {});
console.log(dataByProperty);

关于使用 map/reduce/filter 优化 Javascript 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57767830/

相关文章:

javascript - 如何使用javascript中的变量更改DIV的宽度和高度?

javascript - JavaScript 中原型(prototype)之间的相等性

javascript - jQuery 添加类有效但删除不

javascript - 动画未正确附加到标记

javascript - 程序不会包装两个以上的图像

javascript - lodash - 根据对象的键将对象转换为排序数组

javascript - 将格式化文本保存到数据库并像格式化字符串一样将其检索回 'as is'

javascript - 将多个 div 元素包裹在同一个类中

javascript - 如何使用 jQuery 可以读取的版本号标记我的 CSS 文件?

javascript - Highcharts 将小数值四舍五入为 0。如何避免这种情况?