簡體   English   中英

Javascript將數組元素相互組合的最有效方法

[英]Javascript most efficient way to combine array elements with each other

我正在嘗試將字符串數組與唯一的組合(例如“ Mark | Tom”,但不包含“ Tom | Mark”)結合起來

我寫了這段代碼:

 let arr = ['Tom', 'Danny', 'Mark'] let sets = [] for (let i = 0; i < arr.length; i++) { let others = arr.filter(name => name != arr[i]) others.forEach((other) => { let newel = arr[i] + '|' + other let test = newel.split('|') if (sets.includes(test[1] + '|' + test[0]) || sets.includes(newel)) return sets.push(newel) }) } console.log(sets) 

這是遍歷每個數組元素,然后從基本數組創建其他元素的另一個數組,然后遍歷它們(再次迭代),創建一個組合,檢查我們的元素是否存在反向組合(如果這是在先前的循環中創建的)如果沒有這樣的組合=將其推入目標數組。

有沒有更優雅的方式來完成這項任務?

這個如何:

 const arr = ['Tom', 'Danny', 'Mark']; const sets = []; for (let i = 0; i < arr.length; i++) { for (let j = i + 1; j < arr.length; j++) { sets.push(arr[i] + '|' + arr[j]); } } console.log(sets); 

您也可以在開始計算之前使arr唯一:

const arr = [...new Set(['Tom', 'Danny', 'Mark', 'Tom'])]; // ['Tom', 'Danny', 'Mark']

我會將您的數組設為一個集合,這樣一來,它將像這樣刪除所有重復項:

new Set(['Tom', 'Danny', 'Mark']);

現在,您可以使用.flatMap.flatMap .reduce n th i th元素與所有元素配對直到i th n th元素,如下所示:

 const name_arr = Array.from(new Set(['Tom', 'Danny', 'Mark'])); const res = name_arr.flatMap( (name, i) => name_arr.slice(i+1).reduce((a, n) => [...a, name+'|'+n],[]) ); console.log(res); 

您可以創建一個傳遞數組的集合,遍歷該數組,為每個索引獲取該索引之后的數組,然后循環遍歷另一個數組並構建組合

 let arr = ['Tom', 'Danny', 'Mark'] const uniqueCombo = (arr) => { let newSet = [...new Set(arr)] return newSet.reduce((op, inp, index) => { newSet.slice(index + 1,).forEach(v => { op.push(inp + '|' + v) }) return op },[]) } console.log(uniqueCombo(arr)) console.log(uniqueCombo(['A', 'B', 'A', 'C', 'D'])) console.log(uniqueCombo(['A', 'B', 'A', 'C'])) 

試試這個。 這種方法可以過濾掉以前用於將項目推入數組的索引。

 const arr = ['Tom', 'Danny', 'Mark']; const comb = []; for (let i = 0; i < arr.length; i++) { for (j = i + 1; j < arr.length; j++) { comb.push(arr[i] + '|' + arr[j]); } } console.log(comb); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM