У меня есть два массива 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,
};
};
как мне добиться этого функциональным способом?
@NinaScholz Я обновил вопрос, указав нефункциональный способ вернуть оба, я новичок в функциональном способе. Можно ли этого добиться функциональным способом?
В вашем примере routeOne является самым быстрым, но и TukTuk, и Car будут преодолевать routeOne одновременно за 1,5 единицы времени. Итак, какое транспортное средство имеет преимущество?
@Tim Car
отдает предпочтение, поскольку массив vehicles
уже находится в таком порядке. об этом заботятся
@HariHaravelan, в таком случае, пожалуйста, посмотрите мой ответ.
что вы имеете в виду под функциональный?
@NinaScholz Я читал, что the code in a loop may affect variables defined before it or code that runs after it
не считается чистой функцией
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))
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
что такое функциональный путь?
Вот один из способов найти самый быстрый автомобиль/маршрут:
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; }
код в цикле может влиять на переменные, определенные до него, или код, который выполняется после него, не считается чистой функцией, это было ожиданием Спасибо!
какой результат вы ожидаете?