所以我有一個陣列,它看起來像這樣:
我有一個陣列。
['id1/id2'/span>, 'id3'/span>, 'id4/id5/id6'/span>]
盡管它可能有3個以上的條目,或更多的分割值(/東西)--這些可能會根據應用程式的狀態而改變,但這是一個標準的例子。
我正在嘗試輸出:
[
['id1'/span>, 'id3'/span>, 'id4'/span>]。
['id1'/span>, 'id3'/span>, 'id5'/span>],
['id1'/span>, 'id3'/span>, 'id6'/span>],
['id2'/span>, 'id3'/span>, 'id4'/span>],
['id2', 'id3', 'id5'] 。
['id2', 'id3', 'id6'] .
]
我認為forEach回圈可以用來遞回,但是我在語法上卡住了,所以試著用標準的函式式遞回tpye。我也不確定生成輸出的回傳程式。到目前為止,我所擁有的是:
singleOptionStemGenerator(route: string[] ): [string[] ] {
let returnArray: [string[] ];
route.forEach((options: string) =>/span> {
//span>拆分為各種選項。
let splitOption: string[] = options.split('/'/span>);
splitOption.forEach((str: string) =>/span> {
if(route.length > 1) {
this.singleOptionStemGenerator(route.splice(0, 1) )。)
} else {
return str;
}
})
});
return returnArray;
但是我不確定如何將ID值合并成一個新的陣列,然后將其整體添加到一個新的陣列中。
編輯:下面給出的自己的解決方案有點密集,所以我經歷了一下,把它變成了一個函式并完全注釋了它。我還把它做成了typescript(我用的是這個)。該解決方案是所有的答案,這只是為了方便閱讀和學習而進行的修改。https://codepen.io/bogomip/pen/LYLjrxa
uj5u.com熱心網友回復:
你正在尋找的東西通常被稱為Cartesian Product。 有了計算這些的輔助函式,這幾乎變得微不足道。
這里有一個版本。
這里有一個版本:
。const cartesian = ([xs, ...xss]/span>) =>
xs = undefined ?
? []
: xss.length == 0 ?
? xs .map (x => [x] )
: xs .flatMap (x => cartesian (xss) . map (ys => [x, ... ys])
const separate = (xs) =>
cartesian (xs .map (x => x .split ('/'/span>) )
console . log (separate (['id1/id2', 'id3', 'id4/id5/id6'])
.as-console-wrapper {max-height: 100% ! important; top: 0}
<iframe name="sif1" sandbox="allow-forms allow-modals allow-scripts" class="snippet-box-edit snippet-box-result" frameborder="0"></iframe>
更新
有評論明確指出,這段代碼有些密集。 部分原因是我對純運算式編碼的偏好。 對于那些更習慣于運算式和宣告式Javascript的人來說,這個版本可能更熟悉:const cartesian=(xss)=> {
if (xss .length == 0) {
return [] 。
}
const first = xss [0]
const rest = xss .slice(1)。
if (rest .length == 0) {
return first .map (x =>/span> [x])
}
const cartesianEnd = cartesian (rest)
return first .flatMap (
x => cartesianEnd .map (ys => [x, ... ys])
)
}
如果這種風格更符合你的喜好,那么這也可能有助于解釋我寫的代碼。 除了......把這句話打出來讓我意識到,我的第一種方法有一個可怕的低效率。 不幸的是,這個修復方法增加了一些復雜性,但它顯然是值得的:
const cartesian = ([xs, ...xss]) =>
xs = undefined ?
? []
: xss.length == 0 ?
? xs.map (x => [x] )
: ((yss = cartesian (xss)) => xs .flatMap (>x => yss . map (ys => [x, ... ys])) ()
問題是,我正在為當前陣列的每個元素重新計算其余陣列的乘積。 這些元素不會改變,而且我們應該只做一次。 啊,真正的let系結在JS中! 我們可以用許多不同的方式來做這件事,但是這個方式還不錯。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/319295.html
標籤:
上一篇:陣列中數字的最后索引
