如何用Javascript计数数组中的相同标签行?

时间:2019-06-05 07:49:48

标签: javascript arrays

我在表结构中有以下数组。我想为此计算相同的年龄,并将结果放入Javascript数组中。有人可以提示我如何做吗?

表格形式的数组

Name Country Age
lucy China   20
mark Japan   30
lili Korea   20
jack Japan   21

预期的数组表:

Age Count
20   2
21   1
30   1

在代码类型中:

[
['Age', 'Count']
['20', 2]
['21', 2]
['30', 1]
]

2 个答案:

答案 0 :(得分:0)

  • 创建一个函数,该函数采用2D数组和要作为分组依据的列的索引。
  • 使用slice获得一个没有标题行的数组。
  • reduce所得数组。
  • 通过destructuring参数获取特定索引的值。
  • 使用每个唯一值作为键创建一个累加器对象。递增密钥(如果已存在),否则将其值设置为1。
  • 使用Object.entries()获取键和计数值对。将[<column name>, "Count"]添加到输出数组的开头

这适用于数组的任何索引。

const input = [
["Name", "Country", "Age"],
["lucy", "China", 20],
["mark", "Japan", 30],
["lili", "Korea", 20],
["jack", "Japan", 21]]

function groupColumn(array, index) {
  const merged = input.slice(1).reduce((acc, { [index]: value }) => {
    acc[value] = acc[value] + 1 || 1;
    return acc;
  }, {});
  
  const columnName = array[0][index];
  
  return [[columnName, 'Count'], ...Object.entries(merged)]
}

console.log(JSON.stringify(groupColumn(input, 2))) // Age
console.log(JSON.stringify(groupColumn(input, 1))) // Country

答案 1 :(得分:0)

如果您的阵列看起来像那样,则可以使用以下解决方案。

var array1 = [['lucy','China',20], ['mark','Japan',30], ['lili','Korea',20], ['jack','Japan',21]]

var result = array1.map(x => x[2]).reduce(function (acc, curr) {
  acc[curr] ? acc[curr]++ : acc[curr] = 1;
  return acc
}, {});


console.log(result);

Array​.prototype​.map()创建一个新数组,其结果是在调用数组中的每个元素上调用提供的函数。

Array​.prototype​.reduce() reduce()方法在数组的每个元素上执行reducer函数(由您提供),从而产生单个输出值。