我正在建立一个没有正确或错误答案的测验,取而代之的是,答案的权重为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},
];
答案 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; }