2017-06-27 117 views
3

假設我有一組屬於不同組的隨機洗牌碎片。例如:按匹配起始節點和結束節點排序項目

let pieces = [ 
    { 
    id: "a1", 
    startNode: 18, 
    endNode: 42, 
    }, 
    { 
    id: "a3", 
    startNode: 16, 
    endNode: 30, 
    }, 
    { 
    id: "b2", 
    startNode: 48, 
    endNode: 65, 
    }, 
    { 
    id: "a2", 
    startNode: 42, 
    endNode: 16, 
    }, 
    { 
    id: "a4", 
    startNode: 30, 
    endNode: 31, 
    }, 
    { 
    id: "b1", 
    startNode: 23, 
    endNode: 48, 
    }, 
]; 

我希望他們早在正確的順序兩個數組:

ordered = [ 
    [ 
    { 
     id: "a1", 
     startNode: 18, 
     endNode: 42, 
    }, 
    { 
     id: "a2", 
     startNode: 42, 
     endNode: 16, 
    }, 
    { 
     id: "a3", 
     startNode: 16, 
     endNode: 30, 
    }, 
    { 
     id: "a4", 
     startNode: 30, 
     endNode: 31, 
    }, 
    ],[ 
    { 
     id: "b1", 
     startNode: 23, 
     endNode: 48, 
    }, 
    { 
     id: "b2", 
     startNode: 48, 
     endNode: 65, 
    }, 
    ] 
]; 

他們由他們匹配的開始和結束節點排序,所以「A2」走後「A1」 ,因爲它的startNode與「a1」的endNode匹配。 「b1」和「b2」屬於不同的組,因爲它們不與任何「a」組共享開始或結束節點。該ID不能用於排序,這只是爲了清晰起見。

關於如何做到這一點的任何想法?我認爲它需要某種遞歸功能,我不能把它放在我的腦海裏。

+0

你嘗試過這麼遠嗎? – evolutionxbox

回答

2

而迭代你可以使用迭代的方法子結果以及實際(外部)元素。

這個單元素在一個數組中收集所有匹配的開始和結束節點,而其他不匹配的節點被過濾,之後與收集數組串聯。

var pieces = [{ id: "a1", startNode: 18, endNode: 42 }, { id: "a3", startNode: 16, endNode: 30 }, { id: "b2", startNode: 48, endNode: 65 }, { id: "a2", startNode: 42, endNode: 16 }, { id: "a4", startNode: 30, endNode: 31 }, { id: "b1", startNode: 23, endNode: 48 }], 
 
    result = pieces.reduce(function (r, a) { 
 
     var temp = [a]; 
 
     return r.filter(function (b) { 
 
      if (temp[temp.length - 1].endNode === b[0].startNode) { 
 
       temp = temp.concat(b); 
 
       return; 
 
      } 
 
      if (temp[0].startNode === b[b.length - 1].endNode) { 
 
       temp = b.concat(temp); 
 
       return; 
 
      } 
 
      return true; 
 
     }).concat([temp]); 
 
    }, []); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

哇妮娜,這真的是訣竅。我已經嘗試了更多的數據,它的作用就像一個魅力。現在我需要仔細看看你在那裏用過濾器功能做了什麼。謝謝你無盡的。 –

2

嘗試用簡單的Array#sort() =>a.id > b.id

let pieces = [ { id: "a1", startNode: 18, endNode: 42, }, { id: "a3", startNode: 16, endNode: 30, }, { id: "b2", startNode: 48, endNode: 65, }, { id: "a2", startNode: 42, endNode: 16, }, { id: "a4", startNode: 30, endNode: 31, }, { id: "b1", startNode: 23, endNode: 48, }, ]; 
 

 
console.log(pieces.sort((a,b)=> a.id > b.id))

不支持Arrow功能=>使用與ES5

console.log(
    pieces.sort(function(a,b){ 
    return a.id > b.id}) 
    ) 
+0

儘管這適用於測試用例,我認爲排序應該是startNode == previous endNode – James

+0

對不起,但id和節點值實際上是一些任意的9位數字序列。爲了便於閱讀,我在此修改了它們。它們不能用於排序,只能用於節點值。 –