JavaScript:从数组中分组数据

Posted

技术标签:

【中文标题】JavaScript:从数组中分组数据【英文标题】:JavaScript: Group data from array 【发布时间】:2018-02-06 01:39:23 【问题描述】:

我有一个多维数组,想根据特定索引值的值对其进行过滤。它看起来像这样:

arr = [
       [1 , 101 , 'New post ', 0],
       [2 , 101 , 'New Post' , 1],
       [3 , 102 , 'another post' ,0],
       [4 , 101 , 'New post' ,1],
       [5 , 102 , 'another post' , 1],
       [6 , 103 , 'third post' ,1]
]

我想根据 postId 过滤这个数组,得到同名标题的总和。结果如下所示:

result_arr = [
       [101 , 'New post', 2],
       [102 , 'another post' ,1],
       [103 , 'third post' ,1]
]

【问题讨论】:

您是在nodejs 中做的吗?您使用的nodejs 是什么版本?对于您的问题,我可能有更好的解决方案 不,我没有做 node.js ..我在 d3js 中使用它并从 excel 文件中获取此类数据。 好的,然后为您添加了答案,请检查@Mayank 【参考方案1】:

这是一种相当暴力的方法,但它确实有效。顺便说一句,我会按 id 而不是标题合并您的项目,因为在您的示例中,您的标题大小写不匹配。

var merged = ;
for (var i = 0; i < arr.length; i++) 
    if (!merged[arr[i][1]]) 
        merged[arr[i][1]] = likes: arr[i][3], id: arr[i][1], title: arr[i][2];
     else 
        merged[arr[i][1]].likes += arr[i][3];
    

var result_arr = [];
for (var post in merged) 
    var p = merged[post];
    result_arr.push([p.id, p.title, p.likes]);

【讨论】:

【参考方案2】:

另一种方法,使用reduce 创建组,然后将它们传播回数组。

const arr = [
  [1, 101, 'New post ', 0],
  [2, 101, 'New Post', 1],
  [3, 102, 'another post', 0],
  [4, 101, 'New post', 1],
  [5, 102, 'another post', 1],
  [6, 103, 'third post', 1]
];


const groups = arr.reduce((groups, current) => 
  if (groups[current[1]]) 
    groups[current[1]][2] += current[3];
   else 
    groups[current[1]] = current.slice(1);
  
  return groups;
, );

const result = Object.keys(groups).map((key) => groups[key]);

console.log(result);

【讨论】:

【参考方案3】:

只需减少数组,并使用一个对象作为每个帖子的映射,就像使用帖子 ID 作为键一样。如果使用映射中的键找到任何对象,则添加帖子值,否则为输入数组中的帖子 ID 添加条目。我们开始吧:

var array = [
    [1, 101, 'New post ', 0],
    [2, 101, 'New Post', 1],
    [3, 102, 'another post', 0],
    [4, 101, 'New post', 1],
    [5, 102, 'another post', 1],
    [6, 103, 'third post', 1]
];

function mergeArray(array) 
    var o = array.reduce(function(init, each) 
        var ex = init[each[1]];
        if (ex) 
            ex[2] += each[3];
         else init[each[1]] = each.slice(1);
        return init;
    , );
    return Object.values(o);


console.log('Result: ', mergeArray(array));

【讨论】:

以上是关于JavaScript:从数组中分组数据的主要内容,如果未能解决你的问题,请参考以下文章

mysql表中的javascript多维数组-不知道那种对象对象是啥

php生成json数组然后javascript显示出来

基于变量 javascript 对数组项进行分组

使用 JavaScript 转换数组

JavaScript之纯数组按指定特征分组mapreducetypeofconcatlength

linq.js 按javascript中的对象数组分组