Упростить код работы с массивами

Как упростить код работы с массивами, чтобы:

  • сложность алгоритма была проще (больше быстродействие)
  • код был легко читаемым

Принцип работы функции getMinMaxValue :
Проходится по массиву arr_1 (BaseObject) с объектами (ParentObject) и внутри них по массивам items (Item[])

Записывает минимальное value из массива items в массив minArr
Записывает максимальное value из массива items в массив maxArr

Возвращает объект с полями:
min и значением - результат суммы всех чисел в minArr
max и значением - результат суммы всех чисел в maxArr

    const arr_1 = [
      {
        id: 1,
        type: 'cat',
        items: [
          {
            id: '1_1',
            ratio: '5',
            value: 100
          },
          {
            id: '1_2',
            ratio: '10',
            value: -30
          },
          {
            id: '1_3',
            ratio: '5',
            value: 200
          },
        ]
      },
      {
        id: 2,
        type: 'dog',
        items: [
          {
            id: '1_1',
            ratio: '5',
            value: 200
          },
          {
            id: '1_2',
            ratio: '10',
            value: -60
          },
          {
            id: '1_3',
            ratio: '5',
            value: 300
          },
        ]
      },
      {
        id: 3,
        type: 'rat',
        items: [
          {
            id: '1_1',
            ratio: '5',
            value: 100
          },
          {
            id: '1_2',
            ratio: '10',
            value: -150
          },
          {
            id: '1_3',
            ratio: '5',
            value: 100
          },
        ]
      },
    ]
    
    function getMinMaxValue() {
      const minArr = []
      const maxArr = []
    
      arr_1.forEach((elem) => {
        let min = +Infinity
        let max = -Infinity
    
        elem.items.forEach((item) => {
          const val = item.value
          min = min > val ? val : min
          max = max > val ? max : val
        })
    
        minArr.push(min)
        maxArr.push(max)
      })
    
      return {
        min: minArr.reduce((acc, num) => acc + num, 0),
        max: maxArr.reduce((acc, num) => acc + num, 0),
      }
    }


Типы:

type BaseObject = ParentObject[]

interface ParentObject {
  id: number
  type: string
  items: Item[]
}

interface Item {
  id: string
  ratio: string
  value: number
}

Ответы (1 шт):

Автор решения: Laukhin Andrey

Вариант без minArr и maxArr:

function getMinMaxValue() {
  const ret = {min: 0, max: 0}

  arr_1.forEach((elem) => {
    let min = +Infinity
    let max = -Infinity

    elem.items.forEach((i) => {
      min = min > i.value ? i.value : min
      max = max > i.value ? max : i.value
    })

    ret.min += min
    ret.max += max
  })

  return ret
}

UPD

Еще один вариант, более быстрый, но возможно менее читабельный:

function getMinMaxValue() {
  const ret = {min: 0, max: 0}

  arr_1.forEach((elem) => {
    ret.min += elem.items.reduce((a,b) => a.value < b.value ? a : b).value
    ret.max += elem.items.reduce((a,b) => a.value > b.value ? a : b).value
  })

  return ret
}

Сравнение производительности: введите сюда описание изображения

На диаграмме исходный вариант и два предложенных.

→ Ссылка