[英]javascript - sort only certain elements of array according to position in another array
我有一個包含以下元素的數組(我們稱其為orderArray
):
16 | 18 | 24 | 31 | 33
我有另一個包含這些元素的數組(我們稱其為workingArray
):
16 | 53 | 24 | 58 | 31 | 18
resultArray
可以如下:[ resultArray
]或[16、18、53、24、58、31]
resultArray應該具有workingArray中的所有元素,但排序順序應與orderArray不沖突。
請注意
如果已經有可以執行此操作的函數/庫,我將非常高興-我已經嘗試過_.union
但該工作不起作用。
缺少一些已有的代碼,最簡單的算法是什么?
謝謝。
編輯: resultArray中元素的排序順序應盡可能少地更改-應嚴格進行更改,以免與orderArray中的順序沖突。
大意:
orderArray.filter(inWorkingArray).concat(workingArray.filter(notInOrderArray))
(復制orderArray
忽略項不工作陣列中,然后在項釘workingArray
所沒有的順序陣列中)
您可以使用indexOf
來測試成員資格,或者使用效率更高的實現(在對象中創建所有元素鍵,這會將它們隱式轉換為字符串,從而使優化不適用於非原始對象)。 下面是僅帶有indexOf
的最簡單示例,該示例甚至可以推廣到非原始對象(如子數組):
var inWorkingArray = function(x) {return workingArray.indexOf(x)!=-1};
var notInOrderArray = function(x) {return orderArray.indexOf(x)==-1};
結果:
[16, 18, 24, 31, 53, 58]
這是一個很好的解決方案,但是結果數組中元素的順序不應該改變太多-我們應該盡量使workingArray的順序與原始順序相同-抱歉,我對此不太清楚。 請在問題中查看我的編輯。 --OP
這個問題仍然沒有很好地定義,但是這將根據orderArray對workArray的子集進行排序,從而將不在orderArray中的元素留在原地:
var intersection = orderArray.filter(inWorkingArray);
var c=0;
workingArray.map(function(x){
return notInOrderArray(x) ? x : intersection[c++];
});
結果:
[16, 53, 18, 58, 24, 31]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.