如何减少对象数组?

时间:2019-07-11 17:21:16

标签: javascript arrays typescript

我正在建立一个没有正确或错误答案的测验,取而代之的是,答案的权重为1-4。

每个问题都分配给四个不同类别之一(例如,猫,狗,兔子,羊驼毛)。用户对每个问题的分数将保存到具有指定类别的数组中,如下所示:

answersChosen = [
    {key: 'cat', value: 4},
    {key: 'dog', value: 2},
    {key: 'rabbit', value: 1},
    {key: 'alpaca', value: 3},
    {key: 'cat', value: 1},
    {key: 'dog', value: 4},
    {key: 'rabbit', value: 1},
    {key: 'alpaca', value: 2},
    {key: 'cat', value: 2},
    {key: 'dog', value: 1},
    {key: 'rabbit', value: 4},
    {key: 'alpaca', value: 3},
    {key: 'cat', value: 3},
    {key: 'dog', value: 4},
    {key: 'rabbit', value: 1},
    {key: 'alpaca', value: 2},
];

我试图弄清楚如何将阵列减少到四个类别,并获得每个类别的总分,以便返回最受欢迎的动物。在这种情况下,它将是一只狗:

//New array
results = [
    {key: 'cat', value: 10},
    {key: 'dog', value: 11}, //highest score
    {key: 'rabbit', value: 7},
    {key: 'alpaca', value: 10},
];

2 个答案:

答案 0 :(得分:4)

您可以使用reduce方法,可以映射对象上每个元素的键并将值添加到相应的键

let answersChosen = [{key: 'cat', value: 4},{key: 'dog', value: 2},{key: 'rabbit', value: 1},{key: 'alpaca', value: 3},{key: 'cat', value: 1},{key: 'dog', value: 4},{key: 'rabbit', value: 1},{key: 'alpaca', value: 2},{key: 'cat', value: 2},{key: 'dog', value: 1},{key: 'rabbit', value: 4},{key: 'alpaca', value: 3},{key: 'cat', value: 3},{key: 'dog', value: 4},{key: 'rabbit', value: 1},{key: 'alpaca', value: 2},];

let reduced = answersChosen.reduce((op,{key,value}) => {
  op[key] = op[key] || {key,value:0}
  op[key].value+= value
  return op
},{})

console.log(Object.values(reduced))

答案 1 :(得分:0)

这是一种不同的方法,使用Map并在另一步骤中构建所需的结果集。

要获得最高分,可以减少数组并获得具有最大值的对象。

var answersChosen = [{ key: 'cat', value: 4 }, { key: 'dog', value: 2 }, { key: 'rabbit', value: 1 }, { key: 'alpaca', value: 3 }, { key: 'cat', value: 1 }, { key: 'dog', value: 4 }, { key: 'rabbit', value: 1 }, { key: 'alpaca', value: 2 }, { key: 'cat', value: 2 }, { key: 'dog', value: 1 }, { key: 'rabbit', value: 4 }, { key: 'alpaca', value: 3 }, { key: 'cat', value: 3 }, { key: 'dog', value: 4 }, { key: 'rabbit', value: 1 }, { key: 'alpaca', value: 2 }],
    sums = Array.from(
        answersChosen.reduce((map, { key, value }) => map.set(key, (map.get(key) || 0) + value), new Map),
        ([key, value]) => ({ key, value })
    ),
    max = sums.reduce((r, o) => {
       if (!r.length || r[0].value < o.value) return [o];
       if (r[0].value === o.value) r.push(o);
       return r;
    }, []);

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