我正在做電梯反應,但我需要創建一個函式,將陣列排序到最接近數字 X 并且如果電梯上升或下降,還有一個條件,
例如,
- 共有5層。
- X = 當前樓層 3
您現在在 3 樓并單擊向上按鈕,然后單擊數字 2 -> 5 -> 4 -> 1
應該對陣列進行排序,使其如下所示:3 -> 4 -> 5 -> 2 -> 1。
偽代碼:
let currentFloor = 3;
let direction = "UP";
let clickedButtons = [2,5,4,1];
// ClickedButtons after sorted
clickedButtons = [4,5,2,1]
uj5u.com熱心網友回復:
我想你需要這樣的東西
每當你上升時,你需要找到所有更大的數字并按升序排序,這樣電梯就會在上升時停在下一個可能的樓層。
然后找到所有較低的數字并以相反的順序對它們進行排序。
如果您選擇下降,將執行相反的程式。
let arr = [10, 4, 8, 1, -2, 6];
let x = 3;
const goUp = (num, arr) => arr.filter(obj => obj > num).sort((a, b) => a - b)
const goDown = (num, arr) => arr.filter(obj => obj < num).sort((a, b) => b - a)
function printSequence(arr, initial, direction) {
if (direction === 'up') {
console.log(goUp(initial, arr).concat(goDown(initial, arr)))
} else {
console.log(goDown(initial, arr).concat(goUp(initial, arr)))
}
}
printSequence(arr, 3, 'up')
printSequence(arr, 3, 'down')
uj5u.com熱心網友回復:
您可以將陣列分成兩個陣列。一個只包含比 currentFloor 更高的數字,另一個只包含更低的數字,例如:
let lowerFloors = clickedButtons.filter(floor => floor > currnentFloor);
let upperFloors = clickedButtons.filter(floor => floor > currnentFloor);
然后對每個陣列進行排序,lowerFloors 將按降序排列,higherFloors 將按升序排列。
upperFloors = upperFloors.sort((a, b) => {
return a - b;
});
lowerFloors = lowerFloors.sort((a, b) => {
return a - b;
});
lowerFloors = lowerFloors.reverse();
然后合并兩個陣列。如果你上去 upperFloors 陣列將是第一個,否則 lowerFloors 將是第一個。
let newArray;
if (direction === "UP") {
newArray = upperFloors.concat(lowerFloors);
} else {
newArray = lowerFloors.concat(upperFloors)
}
uj5u.com熱心網友回復:
從我上面的兩個評論...
@Cedric ... 1/2 在這種情況下,唯一需要的排序是例如對所有樓層號進行升序排序...
[1, 2, 3, 4, 5]...找到當前樓層號的索引3...2將'up'被轉換為方向向量的1,因此從 index ... 中獲取高于 index2或右側的所有內容的第一個,以及從 index ... result ...中2獲取的所有左側的所有內容。2[4, 5, 2, 1]@Cedric ... 2/2 One 同樣適用于
'down'/-1其中一個第一個從索引中取出所有內容2,第二個從索引中取出所有內容2...結果[2, 1, 4, 5]...。沒有分類魔法,因為已知預設'up'或'down'樓層旅行時間表是顯而易見的。
......但是當然可以將我的評論的命令式配方轉換為一個排序公式。
function getFloorTravelSchedule(
direction = 'up',
floorNumber = 0,
floorTravelList = [],
) {
direction = ((direction === 'up') && 1) || -1;
function getTravelPrecedence(a, b) {
return (
(a > floorNumber && b > floorNumber && a - b) ||
(a < floorNumber && b < floorNumber && b - a) ||
((a > floorNumber && b < floorNumber && -1) || 1) * direction
);
}
return Array
.from(floorTravelList)
.sort(getTravelPrecedence);
}
const currentFloorNumber = 3;
const selectedFloorNumbers = [2, 5, 4, 1];
const upwardFloorTravelSchedule =
getFloorTravelSchedule('up', currentFloorNumber, selectedFloorNumbers);
const downwardFloorTravelSchedule =
getFloorTravelSchedule('down', currentFloorNumber, selectedFloorNumbers);
console.log({
currentFloorNumber,
selectedFloorNumbers,
upwardFloorTravelSchedule,
downwardFloorTravelSchedule,
});
console.log(
"getFloorTravelSchedule('up', 3, [10, 4, 8, 1, -2, 6]) ...",
getFloorTravelSchedule('up', 3, [10, 4, 8, 1, -2, 6])
);
console.log(
"getFloorTravelSchedule('down', 3, [10, 4, 8, 1, -2, 6]) ...",
getFloorTravelSchedule('down', 3, [10, 4, 8, 1, -2, 6])
);
console.log(
"getFloorTravelSchedule('up', 7, [10, 4, 8, 1, -2, 6]) ...",
getFloorTravelSchedule('up', 7, [10, 4, 8, 1, -2, 6])
);
console.log(
"getFloorTravelSchedule('down', 0, [10, 4, 8, 1, -2, 6]) ...",
getFloorTravelSchedule('down', 0, [10, 4, 8, 1, -2, 6])
);
.as-console-wrapper { min-height: 100%!important; top: 0; }
uj5u.com熱心網友回復:
首先,歡迎來到 StackOverflow!我通常對新來者的建議是,您可以參觀一下,訪問幫助中心并閱讀有關提出好的問題的資訊。在做了一些研究并搜索了關于 SO 的相關主題之后,自己嘗試一下。如果您遇到困難,請發布一個最小的、可重現的嘗試示例,并準確記錄您卡在哪里。
但由于這里已經有答案,我不會等待,而是會提出我自己的建議。
我們可以想象一部電梯有一個狀態。我們可以使用該狀態應用函式來獲得新狀態。出于我們的目的,狀態可能包括電梯的當前樓層、它的行進方向以及預定停靠點串列。
我們正在尋找一種功能,該功能可以乘坐靜止的電梯,但已經選擇了方向,以及要訪問的樓層集合;它應該回傳整個新狀態。如果我們只想要預定停靠點的串列,我們可以從這個狀態讀取它。
我們可以通過呼叫電梯到給定樓層的函式來構建它,只需將樓層串列和初始狀態折疊成一個新狀態。所以addStops將取決于call- 這本身對將電梯呼叫到給定樓層很有用。
在任何一種情況下,我們都需要根據我們當前的樓層和方向對要進行的停靠點進行排序。所以也有一個功能。把這些放在一起,我們可以想象這樣的設計:
const sortStops = (current, direction, stops) => {
const floors = [... stops] .sort ((a, b) => a - b)
const above = floors .filter ((f) => f > current)
const below = floors .filter ((f) => f < current) .reverse ()
return direction == 'UP' ? [... above, ...below] : [...below, ...above]
}
const call = ({current, direction, stops}, floor) => {
const newStops = sortStops ([... new Set ([...stops, floor])], direction, current)
const newDirection = newStops .length ? (newStops [0] > current ? 'UP' : 'DOWN') : direction
return {current, direction: newDirection, stops: newStops}
}
const addStops = ({current, direction, stops}, floors) =>
sortStops (current, direction, stops) .reduce (call, elevator)
// our initial elevator state: on floor 3, headed up, with no stops scheduled
const elevator = {current: 3, direction: 'UP', stops: []}
console .log (addStops (elevator, [2, 5, 4, 1]))
這將回傳
{current: 3, direction: "UP", stops: [4, 5, 2, 1]}
這樣做的好處是我們可以在這個相同的資料結構上撰寫其他函式來執行電梯的其他動作,比如讓它下一站:
const stop = ({current, stops, direction}) => stops .length
? {
current: stops [0],
stops: stops .slice (1),
direction: stops .length > 1 ? stops [1] > stops [0] ? 'UP' : 'DOWN' : 'N/A'
}
: {current, stops, direction: 'N/A'}
const elevator = {current: 3, stops: [], direction: 'UP'}
如果我們打電話stop,{current:3, direction: "UP", stops:[4,5,2,1]}我們會得到
{current:4, direction: "UP", stops:[5,2,1]}
如果我們再次呼叫這個結果,我們會得到
{current:5, direction: "DOWN", stops:[2,1]}
進而
{current:2, direction: "DOWN", stops:[1]}
和
{current:1, direction: "N/A", stops:[]}
此時另一個電話不會做任何事情,再次回傳:
{current:1, direction: "N/A", stops:[]}
我們可以撰寫其他函式——也許是cancelAllStops火警的情況。關鍵是我們可以使用一些簡單的函式來處理不可變的狀態物件。在面向物件的系統中,這些將是可變物件上的方法。在這里,它們只是簡單的功能。這可能是結構化資料的一種非常有用的方法。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/473536.html
標籤:javascript 数组 算法 排序
上一篇:在陣列中構造formData
