2016-09-15 52 views
0

我有以下結構:排序對象的數組,其中的關鍵是一個變量

var arrOfObjects = [ 
    { 
    folder: {id: 2}, 
    children: [] 
    }, 
    { 
    file: {id: 3}, 
    children: [] 
    }, 
    { 
    file: {id: 4}, 
    children: [] 
    }, 
    { 
    folder: {id: 1}, 
    children: [] 
    }, 
]; 

而且我想用下面的函數調用來對它進行排序:

sortArrOfObjects(arrOfObjects, { 
    types: [ 
    ['file'] 
    ], 
    index: 'id', 
    order: 'asc' 
}); 
sortArrOfObjects(arrOfObjects, { 
    types: [ 
    ['folder'] 
    ], 
    index: 'id', 
    order: 'asc' 
}); 

輸出將被排序數組第一個文件,然後是文件夾,如:

var arrOfObjects = [ 
    { 
    file: {id: 3}, 
    children: [] 
    }, 
    { 
    file: {id: 4}, 
    children: [] 
    }, 
    { 
    folder: {id: 1}, 
    children: [] 
    }, 
    { 
    folder: {id: 2}, 
    children: [] 
    }, 
]; 

所以我有以下功能,調用sort()數組中的內置函數,並比較給定鍵存在的對象,並跳過其中一個比較器中不存在鍵的迭代。但它不起作用,它似乎排序完全錯誤的順序。怎麼了?

function sortArrayOfObjects(arr, sortBy) { 
    arr.sort(function (a, b) { 
     var first = ''; 
     var second = ''; 
     for (var i = 0; i < sortBy.types.length; i++) { 
      switch (sortBy.types[i].length) { 
       case 1: 
        if (a[sortBy.types[i][0]] != undefined) { 
         first = a[sortBy.types[i][0]][sortBy.index].toString().toLowerCase(); 
        } else { 
         return; 
        } 
        if (b[sortBy.types[i][0]] != undefined) { 
         second = b[sortBy.types[i][0]][sortBy.index].toString().toLowerCase(); 
        } else { 
         return; 
        } 
        break; 
       case 2: 
        // not implemented yet 
        break; 
       default: 
        break; 
      } 
     } 
     if (first > second) { 
      return (sortBy.order == 'asc') ? 1 : -1; 
     } 
     if (first < second) { 
      return (sortBy.order == 'asc') ? -1 : 1; 
     } 
     return 0; 
    }); 
}; 

回答

2

所謂的技術 「裝飾 - 排序 - 去除裝飾」,使類似的職位很簡單:

var arrOfObjects = [ 
 
    { 
 
     folder: {id: 2}, 
 
     children: [] 
 
    }, 
 
    { 
 
     file: {id: 3}, 
 
     children: [] 
 
    }, 
 
    { 
 
     file: {id: 4}, 
 
     children: [] 
 
    }, 
 
    { 
 
     folder: {id: 1}, 
 
     children: [] 
 
    }, 
 
]; 
 

 
result = arrOfObjects 
 
    .map(obj => ('file' in obj) ? [1, obj.file.id, obj] : [2, obj.folder.id, obj]) 
 
    .sort((a, b) => a[0] - b[0] || a[1] - b[1]) 
 
    .map(x => x[2]); 
 

 

 
console.log(result)

基本上,我們在我們的數組像[item, item...]轉換成數組[ [sort-keys, item], [sort-keys, item]...,然後對這個數組進行排序,最後把我們的項目拉回來 - 按照正確的順序。

+0

嗯,你的方式需要更新版本的JavaScript,不是嗎? – reporter

+0

是的,但只有lambda表達式,它足以將它們轉換爲舊版本中的回調。謝謝! – user99999

相關問題