簡體   English   中英

對象數組的排序在Chrome上以及在Firefox上使用javascript進行的工作中

[英]Array of objects sort works on way on Chrome and the other on Firefox with javascript

我有必要使用另一個列表順序對對象數組進行排序,但是這里捕獲列表上的字符串僅部分滿足了對象的特定屬性。

attribute to verify if it's in the order as shown in the toSort variable. 因此,我需要檢查對象的屬性,以驗證其是否符合toSort變量中所示的順序。

基本上,我有這樣的事情:

var toSort = ['Engeneering', 'Design', 'Implementation', 'Test', 'Homologation'];

var unsortedList = [
{id: 1, name: 'Rework for Test phase'}, 
{id: 2, name: 'Rework for Homologation phase'},
{id: 3, name: 'Rework for Design phase'},
{id: 4, name: 'Excluding Alteration on Implementation phase'}]

我需要一個函數來排序,如toSort變量所示:

var sortedList = [
{id: 3, name: 'Rework for Design phase'},
{id: 4, name: 'Excluding Alteration on Implementation phase'},
{id: 1, name: 'Rework for Test phase'}, 
{id: 2, name: 'Rework for Homologation phase'}];

我以兩種方式做到了。 這適用於Firefox:

function orderByPhase(unsortedList) {
 var sortedlist = [];
 for(var i = 0; i <= toSort.lenght; i++) {
    sortedList = unsortedList.sort(a , b) {
      return a.nome.includes(toSort[i]) && !b.nome.includes(toSort[i]) ? 1 : -1;
    }
 }
return sortedList;
}

但這在Chrome上不起作用。 下面的代碼可以在Chrome上運行,但不能在Firefox上運行:

function orderByPhase(unsortedList) {
 var sortedlist = [];
 for(var i = 0; i <= toSort.lenght; i++) {
    sortedList = unsortedList.sort(a , b) {
        var aFirst = a.nome.includes(this.fases[i]) ? 1 : -1;
        var bFirst = 0;
        bFirst = aFirst && !b.nome.includes(this.fases[i]) ? 1 : -1;
        return bFirst;
    }
 }
return sortedList;
}

有人可以幫我在這里找到中間立場嗎?

您的代碼有幾個問題:

  • lenght在兩個版本中都拼錯了,因此循環根本不會迭代
  • i不應該增加並等於length ,因為那樣會導致未定義的this.phases[i]參考
  • 不確定unsortedList.sort(a, b)打算做什么: ab未定義, sort僅接受一個(可選)參數。 如果有一個參數,它應該是一個函數。 也許您打算編寫這樣的箭頭函數: sort((a,b) =>
  • 當沒有理由強制執行特定順序時, sort回調函數應該能夠返回0。
  • 即使可以工作,也根本沒有效率,因為您在每次迭代中都調用sort ,這將使時間復雜度為O(mnlogn) ,其中mtoSort的長度(我假設是相同的)數組為this.phases ),並且n要排序的數組的大小。

我建議首先映射輸入數組,以使用每個值所屬的索引來豐富它: toSort數組中的索引。 只有這樣,才能調用sort ,並使用一個將比較這些索引的回調。 然后,最后通過map調用再次刪除這些索引。

這是一個實現:

 var toSort = ['Engeneering', 'Design', 'Implementation', 'Test', 'Homologation']; var unsortedList = [ {id: 1, name: 'Rework for Test phase'}, {id: 2, name: 'Rework for Homologation phase'}, {id: 3, name: 'Rework for Design phase'}, {id: 4, name: 'Excluding Alteration on Implementation phase'} ]; var sorted = unsortedList.map(o => [o, toSort.findIndex(word => o.name.includes(word))]) .sort(([,a], [,b]) => a - b) .map(([o]) => o); console.log(sorted); 

這具有O(nm + nlogn)的時間復雜度。

暫無
暫無

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

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