javascript - 提供数组的组合结果

标签 javascript arrays

我有一个数组

data = [ '2016-12-12 pass [pass]',
  '2016-12-12 pass [pass]',
  '2016-12-12 fail [fail]',
  '2016-12-13 fail [fail]',
  '2016-12-14 fail [fail]',
  '2016-12-14 pass [pass]',
  '2016-12-14 pass [pass]',
  '2016-12-15 pass [pass]',
  '2016-12-16 fail [fail]' ]

我尝试并思考了很多方法来使用各种函数来完成但无法找到如何实现这种格式:

2016-12-12 pass:2 fail: 1
2016-12-13 pass:0 fail: 1
2016-12-14 pass:2 fail: 1
2016-12-15 pass:1 fail: 0
2016-12-16 pass:0 fail: 1

最佳答案

这是一种方法:

const data = [
  '2016-12-12 pass [pass]',
  '2016-12-12 pass [pass]',
  '2016-12-12 fail [fail]',
  '2016-12-13 fail [fail]',
  '2016-12-14 fail [fail]',
  '2016-12-14 pass [pass]',
  '2016-12-14 pass [pass]',
  '2016-12-15 pass [pass]',
  '2016-12-16 fail [fail]',
];

const result = {};

data.forEach(item => {
  const [date, passFail] = item.split(' ');
  
  if (!(date in result)) {
    result[date] = { pass: 0, fail: 0 };
  }
  
  result[date][passFail] += 1;
});

console.log(result);

正如您在输出中看到的,这将返回一个对象,其属性名称为日期,其值是具有属性 passfail 的对象。

请注意,您可以使用 reduce 而不是 forEach 来保存一行,但如果您要改变无论如何,我使用了 forEach 来简单起见。

还要注意,虽然在实践中(即在当前的 JS 引擎中)对象保留其属性的插入顺序,但严格来说 JavaScript 对象属性是无序的。如果您想严格遵守顺序,则需要使用数组,在这种情况下,最简单的解决方案是事后转换,如下所示:

const result = {
  "2016-12-12": { pass: 2, fail: 1 },
  "2016-12-13": { pass: 0, fail: 1 },
  "2016-12-14": { pass: 2, fail: 1 },
  "2016-12-15": { pass: 1, fail: 0 },
  "2016-12-16": { pass: 0, fail: 1 },
};

const resultArray = Object.keys(result).sort()
                      .map(key => [ key, result[key] ]);

console.log(resultArray);

关于javascript - 提供数组的组合结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42373868/

相关文章:

javascript - 如何在ajax中执行if else将数据传递给json

java - 对第二个单词进行排序

javascript - 添加到 React 中的数组

c - 为什么 a[n] 在运行时在 c 中被接受?

java - Android 游戏垃圾收集滞后替代品?

javascript - 当其他进程正在运行时,React Native onPress 无法触发

javascript - 为数组中的每个键执行函数 w/o 循环

javascript - 将 MQTT NPM 模块导入 NativeScript

javascript - 如何使用 React Native 在 if 条件内处理 Prop 导航

arrays - 使用未解析的标识符 'WeekOne'