2015-10-13 59 views
0

我有幾個陣列像:如何通過自定義模式排序字符串數組

var arr1 = ['A', 'B', 'C', 'D'], 
    arr2 = ['A', 'C', 'D'], 
    arr3 = ['B', 'D']; 

我現在希望他們通過一個自定義模式,例如進行排序['D', 'C', 'A', 'B']。我正在使用lodash並尋找一個智能這樣做。

+0

您希望每個數組按照相同的模式排序嗎? –

+0

@JaredSmith是的。 – DonJuwe

回答

6

您可以使用一個對象來有效地映射值可排序值:

var arr1 = [ "A", "B", "C", "D" ]; 
 

 
var map = { D: 1, C: 2, A: 3, B: 4 }; 
 
arr1.sort(function(x, y){ return map[x] - map[y]; }); 
 

 
// show result in snippet 
 
document.write(JSON.stringify(arr1));

+0

謝謝,對我來說足夠聰明;) – DonJuwe

0
var pattern = ['D', 'C', 'A', 'B']; 

function sortArray (array, pattern) { 
    return array.sort(function (a, b) { 
     if (pattern.indexOf(a) === pattern.indexOf(b)) { 
      return 0; 
     } else { 
      return pattern.indexOf(a) > pattern.indexOf(b) ? 1 : -1; 
     } 
    }); 
} 

// use like: 
var sortedArray = sortArray(['A', 'C', 'D'], pattern); 
1

相同的基本想法Guffa的解決方案,但有一個可重複使用的API:

var makeSorter = function(pattern) { 
    var map = _.mapValues(_.invert(pattern), Number); 
    return function(vals) { 
     return vals.sort(function(a, b) { 
      return map[a] - map[b]; 
     }); 
    }; 
}; 


var mySorter = makeSorter(['D', 'C', 'A', 'B']); 
mySorter(['A', 'B', 'C', 'D']); //=> ["D", "C", "A", "B"] 
mySorter(['A', 'C', 'D']); //=> ["D", "C", "A"] 

如果您的數據中可能有值而不是在你的模式,那麼你可能需要一些稍微複雜一些:

var makeSorter = function(pattern) { 
    var map = _.mapValues(_.invert(pattern), function(s) {return Number(s) + 1;}); 
    return function(vals) { 
     return vals.sort(function(a, b) { 
      return (map[a] || Infinity) - (map[b] || Infinity); 
     }); 
    }; 
}; 

mySorter(['A', 'X', 'B', 'C', 'Q']); //=> ["C", "A", "B", "X", "Q"] 

此外,好耶ES6箭頭功能。這相當於ES6中的第一個版本:

var makeSorter = pattern => { 
    let map = _.mapValues(_.invert(pattern), Number); 
    return vals => vals.sort((a, b) => map[a] - map[b]); 
};