отфильтруйте массив, чтобы вернуть наилучший процент каждого пользователя в javascript

#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);