按值对嵌套数组进行分组并找到平均值

时间:2019-07-25 06:48:23

标签: javascript arrays ecmascript-6 lodash

大多数其他答案显示将对象数组分组而不是数组分组很热。希望对嵌套数组进行分组并找到其余项的平均值

我想按url(数组中的第二项)对数组进行分组,并找到其余项的平均值。因此,我们应该能够将所有具有相同路径的url分组,例如“ / url / ranking”,它们可以在2个子数组中找到,而/ different / url可以在3个子数组中找到。当我们根据网址对数组进行分组时,我还希望找到其余数字的平均值。

[
 [
    'randomstring4',
    "/url/ranking/",
    12.1176,
    76.8978,
    8.8990
 ],
 [
    'randomstring3',
    "/url/ranking/",
    33.76,
    24.8978,
    7.8990
 ],
 [
    'randomstring2',
    "/different/url/",
    42.1176,
    26.8978,
    83.8990
 ],
 [
    'randomstring1',
    "/different/url/",
    33.76,
    24.8978,
    73.8990
 ],
 [
    'randomstring1',
    "/different/url/",
    13.689,
    4.118,
    53.03
 ],

]

在上面的示例中,我们将按url分组,并获取例如

其余项目的平均值
[ 'randomstring4', "/url/ranking/", 22.93, // (12.1176+33.76)/2 50.89, 8.39 ]

这将提供一种方法来获取来自不同网站的url得分,并根据生成的数据查找平均得分。

这是数组项之一的结果(其余部分可能需要相应地计算)

[ 
'randomstring4', 
"/url/ranking/", 
22.93, // (12.1176+33.76)/2 50.89, 8.39 ]
 (76.8978+24.8978)/2),
( 8.8990+7.8990)/2
]

我的审判在这里https://codepen.io/anon/pen/ymJbPe

1 个答案:

答案 0 :(得分:2)

您可以先对项目进行分组,方法是将其值与它们的和进行计数并计数,并使用分组的数据呈现结果数组。

var data = [['randomstring4', "/url/ranking/", 12.1176, 76.8978, 8.8990], ['randomstring3', "/url/ranking/", 33.76, 24.8978, 7.8990], ['randomstring2', "/different/url/", 42.1176, 26.8978, 83.8990], ['randomstring1', "/different/url/", 33.76, 24.8978, 73.8990], ['randomstring1', "/different/url/", 13.689, 4.118, 53.03]],
    groups = data.reduce((g, array) => {
        var key = array[1];
        g[key] = g[key] || [];
        array.slice(2).forEach((v, i) => {
            g[key][i] = g[key][i] || { sum: 0, count: 0 };
            g[key][i].sum += v;
            g[key][i].count++;
        });
        return g;
    }, {}),
    result = Object
        .entries(groups)
        .map(([group, values]) => (['', group, ...values.map(({ sum, count }) => sum / count)]));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }