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

    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
        }
      }
    ]

    Ответ написан
    Комментировать