javascript - 将对象数组映射到两个数组的更好方法,一个是唯一键,另一个是出现次数

标签 javascript arrays

我有一个对象数组,我正在努力想出一种更好的方法将它映射到两个新数组:一个包含唯一代码值的列表,另一个包含每个代码的出现次数.

注意:结果数组的顺序很重要。例如data[1]应该是labels[1]出现的次数。

这是我目前所拥有的,但我似乎无法找到一种没有多个循环的方法......

var objs = [{
    code: 200,
    message: 'a'
  },
  {
    code: 300,
    message: 'b'
  },
  {
    code: 200,
    message: 'c'
  },
  {
    code: 400,
    message: 'd'
  },
  {
    code: 200,
    message: 'e'
  },
];

var data = [];
var labels = [];

var bins = objs
  .reduce((codes, obj) => {
    let key = obj.code;
    codes[key] ? codes[key]++ : codes[key] = 1;
    return codes;
  }, {});

for (var prop in bins) {
  if (!bins.hasOwnProperty(prop))
    continue;

  labels.push(prop);
  data.push(bins[prop]);
}

console.log('data', data);      // [3, 1, 1]
console.log('labels', labels);  // ['200', '300', '400']

最佳答案

您可以使用 reduce对象数组到 Map , 然后提取 valueskeys成数组:

const values = [{ code: 200, message: 'a' }, { code: 300, message: 'b' }, { code: 200, message: 'c' }, { code: 400, message: 'd' }, { code: 200, message: 'e' }];

const counts = values.reduce((m, { code }) => m.set(code, (m.get(code) || 0) + 1), new Map());

const data = [...counts.values()];
const label = [...counts.keys()];

console.log(data);
console.log(label);

关于javascript - 将对象数组映射到两个数组的更好方法,一个是唯一键,另一个是出现次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46552128/

相关文章:

Javascript 排序自定义比较器函数 - 对已排序的数组进行排序

c - 从C中的字符串中删除出现的数组

c++ - 如何避免字符数组的叠加?

javascript - 在书签中使用 jQuery UI

javascript - 为 Next.js 的服务器文件设置自定义目录

javascript - 对象结构的 Eval 字符串

Python:如何使类 `__call__` 方法接受 NumPy 数组和单个值?

javascript - 单元测试Angular 2错误: Bootstrap at least one component before injecting Router?

javascript - 为什么 jQuery 无法触发对 anchor 标记的 native 点击?

c++ - 如何将两种类型的数据分配给一个变量?