如何基于单个元素合并多维数组的值



给定以下数组,如何获得每个州的年分布?

  • 第一个数组元素是状态
  • 第二个数组元素是数组中每个状态的元素计数
  • 第三个元素是与州相关的年份

例如,看看佛罗里达州。2021年有2个参赛作品,2022年有1个参赛作品。

[
["Arizona", 1, 2021],
["California", 1, 2021],
["Florida", 3, 2021],
["Florida", 3, 2022],
["Florida", 3, 2021],
["Mississippi", 1, 2022],
["Ohio", 3, 2021],
["Ohio", 3, 2022],
["Ohio", 3, 2023],
]

所需的输出数组将折叠这些匹配条目

["Florida", 3, 2021],

总计数保持不变。因此,2+1=3。

[
["Florida", 2, 2021],
["Florida", 1, 2022],
["Ohio", 1, 2021],
["Ohio", 1, 2022],
["Ohio", 1, 2023],
]

我试过过滤,但没有用。这是否可能提供输入?

我尝试了以下方法,但我不知道如何继续。

let filtered = postsSummary.filter((el) => el[3].includes(2021));
console.log(filtered);

输入数据的每个元组的第二个元素只是噪声,可以忽略。在迭代时,您需要维护一个由状态年份组合键控的计数的KV缓存:

function transform (array) {
const cache = {};
for (const [state,, year] of array) {
const key = JSON.stringify([state, year]);
cache[key] = (cache[key] ?? 0) + 1;
}
return Object.entries(cache).map(([json, count]) => {
const [state, year] = JSON.parse(json);
return [state, count, year];
})
}
const input = [
['Arizona', 1, 2021],
['California', 1, 2021],
['Florida', 3, 2021],
['Florida', 3, 2022],
['Florida', 3, 2021],
['Mississippi', 1, 2022],
['Ohio', 3, 2021],
['Ohio', 3, 2022],
['Ohio', 3, 2023],
];
const expected = [
['Arizona', 1, 2021],
['California', 1, 2021],
['Florida', 2, 2021],
['Florida', 1, 2022],
['Mississippi', 1, 2022],
['Ohio', 1, 2021],
['Ohio', 1, 2022],
['Ohio', 1, 2023],
];
function equalJson (a, b) {
return JSON.stringify(a) === JSON.stringify(b);
}
const actual = transform(input);
const equal = equalJson(actual, expected);
console.log('equal:', equal);

最新更新