@iXeon

Как выделить в массиве объектов максимальные и минимальные значения?

Здравствуйте, задача такая, есть список товаров которые получаю с апи и вывожу в список сравнения. Надо найти и выделить там максимальные и минимальные значения среди этого списка и присвоить в стейт что бы дальше отмапить.
setState ( 
[{id: 1, fullPrice: 123, rating: 5},
{id: 2, fullPrice: 103, rating: 3}]
)


Допустим так я могу добавить в объект новые поля min - max по котором при рендере буду выделять значения, но в какой момент времени и где здесь осуществлять поиск максимальных и минимальных значений

setComapreListProduct(
            itemResponse.data.result.map(function(current) { 
                const sortList = Object.assign({}, current)
                    sortList.max = true
                    sortList.min = false
                    return sortList
            })
        )

И то выше не совсем корректный пример потому что мне надо не просто в объект положить новые ключи min-max а добавить их к каждому параметру объекта, т.е как я понимаю получить в итоге такую структуру и вот как это лучше сделать?
[{id: 1, 
fullPrice:  {value: 123, min: false, max: false}, 
rating: {value: 5, min: true, max: false}},]


UPD:
Сейчас дошел вот до такого решения, ищем максимальную цену в исходном массиве, потом в мапе объектов сравниваем с ним и пишем поле max: true. Но кажется что это как то криво, и нужно будет делать для каждого поля такое, а их пока 5
spoiler
64003cc3b7af6781697244.png
  • Вопрос задан
  • 97 просмотров
Решения вопроса 1
sergiks
@sergiks Куратор тега JavaScript
♬♬
Можно сначала пройти по массиву и собрать минимальные/максимальные значения в объекты-словари типа
maxValues = { fullPrice: 123, rating: 5 };
minValues = { fullPrice: 103, rating: 3 };

А затем второй раз пройтись по исходному массиву, расставляя пропсы min/max/value:
Решение
const src = [{ id: 1, fullPrice: 123, rating: 5 }, { id: 2, fullPrice: 103, rating: 3 }];

const checkProps = ['fullPrice', 'rating'];

const xValues = (method, initialValue) =>
  src.reduce((acc, c) => {
    Object.entries(c).forEach(([key, value]) => {
      if (checkProps.includes(key)) {
        acc[key] = Math[method](acc[key], value);
      }
    });

    return acc;
  }, Object.fromEntries(checkProps.map(propName => [propName, initialValue])));

const minValues = xValues('min', Number.POSITIVE_INFINITY);
const maxValues = xValues('max', Number.NEGATIVE_INFINITY);

const result = src.map(item =>
  Object.fromEntries(
    Object.entries(item).map(([key, value]) => {
      if (checkProps.includes(key)) {
        return [key, { value, min: minValues[key] === value, max: maxValues[key] === value }];
      }
      return [key, value];
    })
  )
);

Результат:
[
  {
    "id": 1,
    "fullPrice": {
      "value": 123,
      "min": false,
      "max": true
    },
    "rating": {
      "value": 5,
      "min": false,
      "max": true
    }
  },
  {
    "id": 2,
    "fullPrice": {
      "value": 103,
      "min": true,
      "max": false
    },
    "rating": {
      "value": 3,
      "min": true,
      "max": false
    }
  }
]

Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
noder_ss
@noder_ss
Линуксоид-энтузиаст и SQL разработчик
Можно на js:
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  
</body>
<script>
let array = [2,5,24,76,188,64,97,4,13, -9]
let min = array[0]; 
for(let i = 0; i < array.length; i++){
  if(array[i] < min){
    min = array[i]
  }

}
console.log("Min: " + min);
let array2 = [2,5,24,76,100088,64,97,4,10, -9]
let max = array2[0];
for(let i = 0; i < array2.length; i++){
  if(array2[i] > max){
    max = array2[i]
  }

}
console.log("Max: " + max);
</script>
</html>
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы