2017-06-19 234 views
0

所以我們可以說我有一個數組:排序陣列

const chunks = [ 
    {id: 0, names: ['app']}, 
    {id: 1, names: ['contact']}, 
    {id: 2, names: ['bootstrap']} 
]; 

而且我希望它基於的names屬性進行排序,這樣的順序是這樣的數組:

const original = ['bootstrap', 'app', 'contact']; 

什麼是最有效的方法來做到這一點?

+1

排序背後的邏輯是什麼? –

+1

爲什麼'names'是一個數組,當它包含多於或少於一個項目時會發生什麼? – Bergi

+0

如何處理'{id:999,名稱:['app','bootstrap']}'? – georg

回答

1

你可以使用名稱的指標的delat原。

const chunks = [{ id: 0, names: ['app'] }, { id: 1, names: ['contact'] }, { id: 2, names: ['bootstrap'] }], 
 
    original = ['bootstrap', 'app', 'contact']; 
 

 
chunks.sort((a, b) => original.indexOf(a.names[0]) - original.indexOf(b.names[0])); 
 

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

1

試試這個方法:

const chunks = [{id: 0, names: ['app']}, {id: 1, names: ['contact']}, {id: 2, names: ['bootstrap']}]; 
const original = ['bootstrap', 'app', 'contact']; 
let result = []; 
for(let i = 0; i < original.length; i++) { 
    for(let j = 0; j < chunks.length; j++) { 
     if(chunks[j].names.indexOf(original[i]) !== -1) { 
      result.push(chunks[j]); 
     } 
    } 
} 
console.log(result); 
+0

這就是我一開始就想到的,但@NinaScholz的方式非常乾淨! – Ancinek

1

簡單的方法:轉換成塊的對象,所以你得到正確的一個只用鍵,然後在(已排序)陣圖中的對象,堵塞的地方。

cMap = chunks.reduce((p,c) => Object.assign(p, {[c.names[0]]: c}), {}); 
const sorted = original.map(k => cMap[k]); 
+0

不錯的方法,但你會想提到,這隻適用於每個名稱只有一個塊的情況。 – Bergi

+0

的確,我沒有考慮到這一點。幸運的是,比我自己還有更多挑剔的眼睛:)。 – cheesenthusiast