#javascript
Вопрос:
У меня есть массив под названием данные, в котором хранится информация о пользователях. Я хочу отфильтровать его, чтобы вернуть мне лучший процент от каждого пользователя.как я могу это сделать. это мой массив:
let data = [ {
"userId": "1",
"percent": 97.58,
},
{
"userId": "1",
"percent": 92.01,
},
{
"userId": "2",
"percent": 91.64,
},
{
"userId": "2",
"percent": 91.64,
},
{
"userId": "3",
"percent": 91.64,
}]
Комментарии:
1. Должно быть легко найти аналогичные вопросы (и ответы на них), которые задавались в течение последнего десятилетия.
2. Обманутый не отвечает на вопрос OPs, который является лучшим из тех же идентификаторов
Ответ №1:
Я бы использовал сокращение:
let data = [
{ "userId": "1", "percent": 97.58, },
{ "userId": "1", "percent": 92.01, },
{ "userId": "2", "percent": 91.12, },
{ "userId": "2", "percent": 91.64, },
{ "userId": "3", "percent": 91.45, }
]
const bestGrades = data.reduce((acc, cur) => {
acc[cur.userId] = acc[cur.userId] || 0; // initialise the entry
acc[cur.userId] = Math.max(acc[cur.userId],cur.percent); // take the greatest
return acc;
}, {})
console.log(bestGrades)
Ответ №2:
reduce
это полезный метод, поскольку он позволяет накапливать новую информацию в новый объект по мере перебора массива.
const data=[{userId:"1",percent:97.58},{userId:"1",percent:92.01},{userId:"2",percent:91.64},{userId:"2",percent:91.64},{userId:"3",percent:91.64}];
const out = data.reduce((acc, c) => {
// Grab the id and percentage from the current object
const { userId: id, percent } = c;
// If the initial object that you pass in (the accumulator)
// doesn't have a property with a key that matches the id
// set a new property with the percentage value
acc[id] = acc[id] || percent;
// If the value of the percentage of the current object
// is greater than the value set on the existing property
// update it
if (percent > acc[id]) acc[id] = percent;
// Return the accumulator for the next iteration
return acc;
}, {});
console.log(out);