簡體   English   中英

javascript-根據另一個數組中的位置僅對數組的某些元素進行排序

[英]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不沖突。
請注意

  • orderArray和workingArray可以具有彼此不同的元素
  • 元素在數組中是唯一的

如果已經有可以執行此操作的函數/庫,我將非常高興-我已經嘗試過_.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.

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