Упростить код работы с массивами
Как упростить код работы с массивами, чтобы:
- сложность алгоритма была проще (больше быстродействие)
- код был легко читаемым
Принцип работы функции 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
}
На диаграмме исходный вариант и два предложенных.
