Javascript - зациклить два массива внутри другого функционального способа

У меня есть два массива vehicles и routes, приведенные ниже

const vehicles = [{ name: 'TukTuk', maxSpeed: 12 },
{ name: 'Bike', maxSpeed: 10 },
{ name: 'Car', maxSpeed: 20 }];

const routes = [{ name: 'routeOne' , distance: 18, allowedSpeed: 12 }
, {name: 'routeTwo',  distance: 20, allowedSpeed: 10 }];

Существует это правило, транспортное средство будет двигаться с разрешенной скоростью маршрута, даже если оно может двигаться быстрее.

Это описано в этой функции

const getTravelTime = (vehicle, route) => { 
    return route.allowedSpeed < vehicle.maxSpeed ? (route.distance / route.allowedSpeed) : (route.distance / vehicle.maxSpeed);
};

Цель состоит в том, чтобы найти самый быстрый маршрут и транспортное средство для Путешествия.

У меня есть реализация, которая не работает

const getFastestJourney = (vehicles,routes) => {
    let fastestTime = Infinity; 
    let fastestRoute,fastestVehicle;
    for(let i =0;i < vehicles.length; i++){
        for(let j=0;j< routes.length;j++){
            let travelTime = getTravelTime(vehicles[i],routes[j]);
            if (travelTime < fastestTime){
                fastestVehicle = vehicles[i];
                fastestRoute = routes[j];
                fastestTime = travelTime;
            }
        }
    }
    return {
        route: fastestRoute,
        vehicle: fastestVehicle,
    };
};

как мне добиться этого функциональным способом?

какой результат вы ожидаете?

Nina Scholz 18.03.2022 17:06

@NinaScholz Я обновил вопрос, указав нефункциональный способ вернуть оба, я новичок в функциональном способе. Можно ли этого добиться функциональным способом?

HariHaravelan 18.03.2022 17:20

В вашем примере routeOne является самым быстрым, но и TukTuk, и Car будут преодолевать routeOne одновременно за 1,5 единицы времени. Итак, какое транспортное средство имеет преимущество?

Tim 18.03.2022 17:30

@Tim Car отдает предпочтение, поскольку массив vehicles уже находится в таком порядке. об этом заботятся

HariHaravelan 18.03.2022 17:34

@HariHaravelan, в таком случае, пожалуйста, посмотрите мой ответ.

Tim 18.03.2022 17:42

что вы имеете в виду под функциональный?

Nina Scholz 18.03.2022 17:53

@NinaScholz Я читал, что the code in a loop may affect variables defined before it or code that runs after it не считается чистой функцией

HariHaravelan 18.03.2022 18:05
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
7
61
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

const vehicles = [{ name: 'TukTuk', maxSpeed: 12 },
{ name: 'Bike', maxSpeed: 10 },
{ name: 'Car', maxSpeed: 20 }];

const routes = [{ name: 'routeOne' , distance: 18, allowedSpeed: 12 }
, {name: 'routeTwo',  distance: 20, allowedSpeed: 10 }];

function fast(cars, roads){
    let maxSpeed = -1, speedIndex=0;
    for(let i in cars)
        if (maxSpeed < cars[i].maxSpeed){
            maxSpeed = cars[i].maxSpeed;
            speedIndex = i;
        }
    let minTime = Infinity, roadIndex=0;
    for(let i in roads)
        if (minTime > roads[i].distance/Math.min(roads[i].allowedSpeed, maxSpeed)){
            minTime=roads[i].distance/Math.min(roads[i].allowedSpeed, maxSpeed);
            roadIndex=i;
        }
    return [cars[speedIndex].name, roads[roadIndex].name]
}

console.info(fast(vehicles, routes))

Или, если вам не нравятся циклы for

const vehicles = [{ name: 'TukTuk', maxSpeed: 12 },
    { name: 'Bike', maxSpeed: 10 },
    { name: 'Car', maxSpeed: 20 }];

const routes = [{ name: 'routeOne' , distance: 18, allowedSpeed: 12 },
    {name: 'routeTwo',  distance: 20, allowedSpeed: 10 }];

function fast(cars, roads){
    const maxSpeed = Math.max(...cars.map(e => e.maxSpeed))
    const times = roads.map(e => e.distance/Math.min(e.allowedSpeed, maxSpeed));
    const minTime = Math.min(...times)
    const carIndex = cars.findIndex(e => e.maxSpeed==maxSpeed)
    const roadIndex = times.findIndex(e => e==minTime)
    return [cars[carIndex], roads[roadIndex]]
}

console.info(fast(vehicles, routes))

была опечатка, я исправил

palmarbg 18.03.2022 17:23

У меня похожая реализация, не могли бы вы помочь с функциональным способом @palmarbg

HariHaravelan 18.03.2022 17:25

что такое функциональный путь?

palmarbg 18.03.2022 17:49

Вот один из способов найти самый быстрый автомобиль/маршрут:

const vehicles = [
  {name: 'TukTuk',maxSpeed: 12},
  {name: 'Bike', maxSpeed: 10},
  {name: 'Car', maxSpeed: 20}
]

const routes = [
  {name: 'routeOne', distance: 18, allowedSpeed: 12},
  {name: 'routeTwo', distance: 20, allowedSpeed: 10}
]

function getFastestRoute(vehicles, routes) {
  let times = []

  // Calculate times for each route/vehicle combo
  routes.forEach(r => {
    vehicles.forEach(v => {
      times.push({
        route: r.name,
        vehicle: v.name,
        time: r.distance / Math.min(r.allowedSpeed, v.maxSpeed)
      })
    })
  })

  // Find fastest time and route
  let fastest = times.reduce((prev, curr) => prev.time < curr.time ? prev : curr)

  return fastest
}

console.info(getFastestRoute(vehicles, routes))

Если вам нужны все самые быстрые транспортные средства и маршруты, вы можете использовать это вместо этого:

let fastest = times.filter(f => f.time === Math.min(...times.map(t => t.time)))
Ответ принят как подходящий

Вы можете получить массив всех комбинаций vehicles и routes и их времени в пути и уменьшить этот массив, ища более короткое время и более быстрое транспортное средство.

const
    vehicles = [{ name: 'TukTuk', maxSpeed: 12 }, { name: 'Bike', maxSpeed: 10 }, { name: 'Car', maxSpeed: 20 }],
    routes = [{ name: 'routeOne' , distance: 18, allowedSpeed: 12 }, {name: 'routeTwo',  distance: 20, allowedSpeed: 10 }],
    getTravelTime = (vehicle, route) => route.distance / (route.allowedSpeed < vehicle.maxSpeed ? route.allowedSpeed : vehicle.maxSpeed),
    result = vehicles
        .flatMap(v => routes.map(r => ({ 
            vehicle: v.name,
            maxSpeed: v.maxSpeed,
            route: r.name,
            time: getTravelTime (v, r)
        })))
        .reduce((a, b) => 
            a.time === b.time && a.maxSpeed > b.maxSpeed ||
            a.time < b.time
                ? a
                : b
        );

console.info(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

код в цикле может влиять на переменные, определенные до него, или код, который выполняется после него, не считается чистой функцией, это было ожиданием Спасибо!

HariHaravelan 18.03.2022 18:06

Другие вопросы по теме