简体   繁体   English

Javascript - 在另一种功能方式中循环两个 arrays

[英]Javascript - Loop two arrays inside another functional way

I have two arrays vehicles and routes , given below我有两辆 arrays vehiclesroutes ,如下所示

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 }];

There is this rule, the vehicle would travel in the route's allowed speed even it can ride faster有这个规则,车辆即使能骑得再快,也会以路线允许的速度行驶

That is covered written in this function这涵盖在 function 中

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

The objective is to find the fastest route and vehicle for the Journey目标是为旅程找到最快的路线和车辆

I have a implementation which is not functional我有一个不起作用的实现

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,
    };
};

how do I achieve that in the functional way?我如何以功能方式实现这一目标?

 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.log(fast(vehicles, routes))

Or if you don't like for loops或者如果你不喜欢 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.log(fast(vehicles, routes))

Here is one way to find the fastest vehicle/route:这是找到最快车辆/路线的一种方法:

 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.log(getFastestRoute(vehicles, routes))

If you need all fastest vehicles and routes, you can use this instead:如果您需要所有最快的车辆和路线,您可以改用它:

let fastest = times.filter(f => f.time === Math.min(...times.map(t => t.time)))

You could get an array of all combinations of vehicles and routes and their travel time and reduce this array by looking for shorter time and faster vehicle.您可以获得vehiclesroutes及其旅行时间的所有组合的数组,并通过寻找更短的时间和更快的车辆来减少此数组。

 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.log(result);
 .as-console-wrapper { max-height: 100%;important: top; 0; }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM