Алгоритмы составления топа-50 items по входящим позициям

Есть такая задачка которую я уже не могу сам решить. Требуется из входящих данные составить топ 50 лучших.

Данные для определения топа это просто цифры в одном item их может быть от 1 до n количества ( но есть определенная граница, к примеру это будет 3, она тоже динамическая и определяется по количеству источников )

К примеру возьмем 3 item с такими данным [3, 2, 3], [1, 3], [3] Ранее я пытался подобное считать с помощью средней арифметической, то есть сложить все цифры в массиве и разделить на количество. Но этот подход выдает не совсем правильные данные

Выходят item с наименьшими элементами на 1 место, а должно быть наоборот так как источников нашлось меньше, недостающие позиций можно считать за 51

Эту 51 можно использовать в расчете, я это тоже пробовал. Вышло еще хуже, item разбросаны не понятно как

Подскажите какие алгоритмы тут могут быть полезны и примеры их если не затруднит. Задача уже горит, сделать нужно, а в голове каша образовалась

Проще говоря возьмем ТОП-3

С входящими 9 item. У каждого item есть своя позиция изначальная, из этих изначальных позиций мне нужно составить алгоритм поиска общей позиций.

[[1,2,1], [2,1,3], [3,5,6], [2], [1,3], [3], [5], [5,5,3], [3,7,12]] - это массив items с масивом позиций item по которым происходит составление ТОПа

То есть [1, 2, 1] - это 1 item с тремя источниками и их позициями. Ранее я делал так 1 + 2 + 1 = 4 / 3(колличество источников) и получал балл для сортировки

Но так как источников может быть от 1 до условно 3, этот метод отпадает, из-за того что item с данными [2] всегда стоит выше чем [1, 2, 1], а тут меньше источников что уже делает его не таким важным чем [1, 2, 1] где есть все источники к тому же на первых позициях. Надеюсь теперь стало понятнее Вот кусок кода который создает рейтинг балл

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

    rating = () => {
    this.tracks = this.tracks.map(_collection => {
        const positions = []

        _collection.data.forEach((_track, _index) => {
            if (_index <= this.services.length) {
                positions.push({
                    service: _track.parent.service,
                    position: _track.parent.position
                })
            }
        })

        // Ищем не найденные треки и добавляем им позиицию 101
        this.entityServices.forEach(service => {

            const position = positions.find(_position => {
                if (_position.service === service.name) return _position
            })

            if (!position) {
                positions.push({
                    service: service.name,
                    position: 101
                })
            }
        })

        // Складываем все позиции
        let summ = 0
        positions.forEach(position => {
            const service = this.entityServices.find(_service => {
                if (_service.name === position.service) return _service
            })
            const weight = (service) ? service.weight : 1
            summ += (position.position * weight)
        })

        // Делим сумму на колличество сервисов и обрезаем число после запятой на 2
        summ = ((summ / positions.length) * this.entityServices.length)

        _collection.rawPosition = summ

        return _collection
    })
    
    return this
}

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