我有點想創建一個在工廠中最常見的功能。一種輪換系統,人們交換他們的位置,而其他人則休息。
通過 DragnDrop 我創建/添加/更新地圖并將此地圖轉換為陣列陣列,如下所示:
let example1 = [
['John', ['99', '1']],
['Jo', ["1", "3"]],
["Alpha", ["99", "4"]],
["Beta", ["3", "2"]],
["Gamma", ["2", "99"]],
["Delta", ["4", "5"]],
["Maria", ["5", "6"]],
["Epsilon", ["6", "99"]],
];
第一個數字代表舊職位,第二個數字代表新職位。數字 99 代表休息時間。上面例子的輸出應該是這樣的:
outputExample1 = [
["John", "1", "3", "2"],
["Alpha", "4, "5", "6"]
]
所以每個序列和遞回都應該以一個斷路器(=數字 99)開始并以一個斷路器結束。在上面的例子中:在第一站放置“約翰”后,它應該“搜索”來自第一站的男/女“現在”的位置。在這個例子中,他在 3. 現在再次搜索他汀類藥物 3 現在的位置。(=2) ... 直到數字為 99,本例就是這種情況。這就是為什么我開始在 'activ'(<99) 和 'breakers'(==99) 中過濾原始陣列。我嘗試了很多方法并不斷失敗(while 回圈以無限回圈結束,輸出完全錯誤),因為我沒有找到一個好的遞回。
任何提示都非常寶貴
PS:請考慮上面的陣列已“完成”以提供一個很好的示例,并且可能無法即時完成(通過拖放)。意思是:如果我開始拖動序列肯定沒有完成。
編輯:肯定至少會有一個“99”。如果不是沒有序列和沒有輸出。除了 99er 之外,“新職位”也沒有重復。(無論如何都是首發
uj5u.com熱心網友回復:
您可以采用順序方法并按順序訪問所有節點,您有。然后為最頂部的專案采用嵌套屬性并保持與節點的關系。最后只回傳頂部節點。
如有必要,獲取鍵/值對陣列的結果條目。
const
data = [['John', ['99', '1']], ['Jo', ["1", "3"]], ["Alpha", ["99", "4"]], ["Beta", ["3", "2"]], ["Gamma", ["2", "99"]], ["Delta", ["4", "5"]], ["Maria", ["5", "6"]], ["Epsilon", ["6", "99"]]],
relations = data
.reduce((r, [top, [from, to]]) => {
if (to === '99') return r;
if (from === '99') {
r[to] = r.top[top] = [to];
} else {
r[from].push(to);
r[to] = r[from];
}
return r;
}, { top: {} })
.top;
console.log(relations);
.as-console-wrapper { max-height: 100% !important; top: 0; }
沒有reduce.
const
data = [['John', ['99', '1']], ['Jo', ["1", "3"]], ["Alpha", ["99", "4"]], ["Beta", ["3", "2"]], ["Gamma", ["2", "99"]], ["Delta", ["4", "5"]], ["Maria", ["5", "6"]], ["Epsilon", ["6", "99"]]],
temp = {},
relations = {};
for (const [top, [from, to]] of data) {
if (to === '99') continue;
if (from === '99') {
temp[to] = relations[top] = [to];
} else {
temp[from].push(to);
temp[to] = temp[from];
}
}
console.log(relations);
.as-console-wrapper { max-height: 100% !important; top: 0; }
uj5u.com熱心網友回復:
Nina 的回答很好,只要您的資料始終按照示例進行排序。如果沒有,那么這可能會有所幫助:
const cycleUntil = (schedule, x, [_, [f, t]] = schedule .find (([_, [f]]) => x == f)) =>
f == 99 ? [] : [f, ... cycleUntil (schedule, t)]
const transform = (schedule) =>
schedule .filter (([n, [f]]) => f == '99')
.map (([n, [f, t]]) => [n, ... cycleUntil (schedule, t)])
const example1 = [['John', ['99', '1']], ['Jo', ["1", "3"]], ["Alpha", ["99", "4"]], ["Beta", ["3", "2"]], ["Gamma", ["2", "99"]], ["Delta", ["4", "5"]], ["Maria", ["5", "6"]], ["Epsilon", ["6", "99"]] ]
console .log (transform (example1))
const example2 = [...example1, ["Zeta", ["99", "7"]], ["Eta", ["7", "10"]], ["Theta", ["8", "99"]], ["Iota", ["9", "8"]], ["Kappa", ["10", "9"]]]
console .log (transform (example2))
.as-console-wrapper {max-height: 100% !important; top: 0}
這里我們的transform功能發現與開始的所有元素'99',并回傳與他們一起呼叫的結果相關聯的名稱cycleUntil的功能,這需要一個站和整個時間表,并回傳一個陣列,包括該站,并且,遞回地,該元件與該to站它的from位置。
如果資料構造不正確,這將失敗。幾乎肯定需要一些錯誤檢查以確保資料完整。但我會把它留作練習。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/344885.html
標籤:javascript 递归 多维数组
上一篇:輸入范圍內的遞回函式
下一篇:如何鍵入遞回可變引數元組
