繁体   English   中英

对数组对象内的数值数组进行排序,同时保持其他数组的顺序与已排序的数值数组的顺序相同

[英]Sort a numeric array inside of an object of arrays while keeping the order of the other arrays in the same order as the sorted numeric array

我知道,这听起来像是一个沉重的问题,但让我澄清一下。 我创建了一个应用程序,可以拉取位置仓库、 facilities并将它们传递到循环中。 该循环运行并将每个设施(地址)与用户通过 Google Maps DistanceMatrix API 输入的地址或邮编进行比较。 这是衍生facilitiesdistancestimes数组的地方。 在这个小例子中,我删除了所有的动态部分,以获得代码的工作输出来测试和硬编码所有结果。 另外,这样我就不会一直调用 Google Maps API。 无论如何,所有的facilitiesdistancestimes都井井有条,属于彼此。 我的意思是, facilities[0]属于distances[0]times[0]值。 每个数组中的后续项目也是如此。 数组中的每个 item[i] 分别属于另一个数组中相同编号的 item[i]。

我正在尝试对distances数组进行排序,但现在我在某种意义上混淆了数据,所以我不确定如何保持distances[0]说它是否与其他数组按顺序移动到distances[3]值,因为facilites[0]times[0]没有被排序。

现在,在对数据进行排序之前,我使用 Object.assign 方法将每个数组传递到resultsObject 您会看到,如果您对其进行测试,您将拥有一个包含三个数据数组的对象,这些数组的顺序都相同(基于我上面的解释)。 有没有办法在resultsObject内部对distances进行排序,同时以相同的顺序对其他两个facilitestimes进行排序? 对不起,如果我过度描述或重复自己,但我试图尽可能地描述。

 let inputVal = []; let facilityArray = []; let distanceArray = []; let timeArray = []; let filteredArray = []; let sortedArray = []; let resultsObject, intDistanceResult; callFetch = () => { const facilities = ["MD01", "PA01", "OH01", "NC01", "GA01", "SC01", "SC02", "TN01", "AL01", "FL02", "TX01", "IN01", "SC03", "FL01"]; const distances = [133, 32, 538, 422, 795, 666, 664, 822, 1118, 867, 1504, 657, 635, 1210]; const times = ["2 hours 12 mins", "47 mins", "8 hours 20 mins", "6 hours 32 mins", "12 hours 0 mins", "10 hours 2 mins", "9 hours 56 mins", "12 hours 21 mins", "16 hours 33 mins", "12 hours 43 mins", "22 hours 16 mins", "10 hours 16 mins", "9 hours 39 mins", "17 hours 35 mins" ]; facilityArray.push(facilities); distanceArray.push(distances); timeArray.push(times); // console.log(distanceArray); // sortedArray = distanceArray.sort((a, b) => a - b); // console.log(sortedArray); resultsObject = Object.assign({}, [facilityArray, distanceArray, timeArray]); console.log(resultsObject); } form.addEventListener("submit", e => { e.preventDefault(); callFetch(); });
 <!DOCTYPE html> <html> <head> <title>Ethos Service Center - Google Maps Distance Search</title> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" integrity="sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk" crossorigin="anonymous"> </head> <body> <div class="container-sm mt-3"> <form class="form mb-3" id="form"> <div class="search"> <div class="card-body"> <div class="input-group"> <div class="input-group-prepend"> <span class="input-group-text">Patient Destination</span> </div> <input class="form-control" type="text" placeholder="Enter Zip Code" class="patientaddress" id="patientaddress"> <div class=" input-group-prepend "> <span class="input-group-text " id="message "></span> </div> </div> <hr> <button class="btn btn-primary mt-2 " type="submit " id="submit ">Submit</button> </div> </div> </form> </div> </body> </html>

 let inputVal = []; let facilityArray = []; let distanceArray = []; let timeArray = []; let filteredArray = []; let sortedArray = []; let resultsObject, intDistanceResult; callFetch = () => { const facilities = ["MD01", "PA01", "OH01", "NC01", "GA01", "SC01", "SC02", "TN01", "AL01", "FL02", "TX01", "IN01", "SC03", "FL01"]; const distances = [133, 32, 538, 422, 795, 666, 664, 822, 1118, 867, 1504, 657, 635, 1210]; const times = ["2 hours 12 mins", "47 mins", "8 hours 20 mins", "6 hours 32 mins", "12 hours 0 mins", "10 hours 2 mins", "9 hours 56 mins", "12 hours 21 mins", "16 hours 33 mins", "12 hours 43 mins", "22 hours 16 mins", "10 hours 16 mins", "9 hours 39 mins", "17 hours 35 mins" ]; facilityArray.push(facilities); distanceArray.push(distances); timeArray.push(times); // console.log(distanceArray); // sortedArray = distanceArray.sort((a, b) => a - b); // console.log(sortedArray); resultsObject = Object.assign({}, [facilityArray, distanceArray, timeArray]); console.log(resultsObject); } form.addEventListener("submit", e => { e.preventDefault(); callFetch(); });
 <!DOCTYPE html> <html> <head> <title>Service Center - Google Maps Distance Search</title> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" integrity="sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk" crossorigin="anonymous"> </head> <body> <div class="container-sm mt-3"> <form class="form mb-3" id="form"> <div class="search"> <div class="card-body"> <div class="input-group"> <div class="input-group-prepend"> <span class="input-group-text">Patient Destination</span> </div> <input class="form-control" type="text" placeholder="Enter Zip Code" class="patientaddress" id="patientaddress"> <div class=" input-group-prepend "> <span class="input-group-text " id="message "></span> </div> </div> <hr> <button class="btn btn-primary mt-2 " type="submit " id="submit ">Submit</button> <button class="btn btn-outline-success mt-2 ml-3 " type="reset " value="Reset " id="refresh">Clear Destination</button> </div> </div> </form> </div> <script type="text/javascript " src="main.js "></script> </body> </html>

将数组合并为单个对象数组,然后按距离排序

 const facilities = ["MD01", "PA01", "OH01", "NC01", "GA01", "SC01", "SC02", "TN01", "AL01", "FL02", "TX01", "IN01", "SC03", "FL01"]; const distances = [133, 32, 538, 422, 795, 666, 664, 822, 1118, 867, 1504, 657, 635, 1210]; const times = ["2 hours 12 mins", "47 mins", "8 hours 20 mins", "6 hours 32 mins", "12 hours 0 mins", "10 hours 2 mins", "9 hours 56 mins", "12 hours 21 mins", "16 hours 33 mins", "12 hours 43 mins", "22 hours 16 mins", "10 hours 16 mins", "9 hours 39 mins", "17 hours 35 mins" ]; const combined = facilities.map((facility,i) =>({facility, distance: distances[i], time: times[i]})) .sort((a,b) => a.distance-b.distance) console.log(combined)

Object.assign解决方案并没有真正帮助您Object.assign 您需要为设施、距离和时间的每个三元组创建小对象:

let triples = facilities.map((facility, i) => ({
    facility,
    distance: distances[i],
    time: times[i]
}));

这个数组可以按距离排序:

triples.sort((a, b) => a.distance - b.distance);

暂无
暂无

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

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