目前所有的解決方案假定數字將XXXX-Y
其中Y
總是0
和9
之間的數字(也許這是要求,但目前尚不清楚的問題)。在這種情況下,我們正在與Strings
合作,所以1234-15
將低於1234-7
。需要以數字方式對Arrays
進行排序。如果我們使用下一個Array
與當前解決方案的頁面上,這將是結果:
var array = ["14670-20", "7851", "7851-2", "14670-10", "7851-1", "2234", "2235", "2235-1", "14670-7"];
// ["14670-20", "7851", "14670-10", "7851-1", "2235"]
// ["14670-10", "14670-20", "7851", "7851-1", "2235"]
// ["2235", "7851", "7851-1", "14670-10", "14670-20"]
數量14670-7
已經因爲下跌,爲String
,其大於14670-10
和14670-20
。
在這裏,你有第一批訂單的Array
的解決方案,以及未來降低值,以獲得較低的人(此解決方案改變了原有Array
的順序)
var array = ["14670-20", "7851", "7851-2", "14670-10", "7851-1", "2234", "2235", "2235-1", "14670-7"];
function getFilteredArray (array) {
var reg = /^(\d+)\-?(\d*)$/; \t
var current = "";
var sort = function (a, b) {
var ra = a.match(reg), rb = b.match(reg);
if (ra[1] === rb[1]) { return (+ra[2]) - (+rb[2]); }
return (+ra[1]) - (+rb[1]);
}
return array.sort(sort).reduce(function (bundle, item, index) {
var number = item.split("-")[0];
bundle.splice((current !== number) ? -1 : bundle.length, 1, item);
current = number;
return bundle;
}, []).slice(0, -1);
}
console.log(getFilteredArray(array));
這另一種解決方案是稍長一點,但它保持原來的順序Array
:
var array = ["14670-20", "7851", "7851-2", "14670-10", "7851-1", "2234", "2235", "2235-1", "14670-7"];
function getFilteredArray (array) {
var reg = /^(\d+)\-?(\d*)$/;
var sort = function (a, b) {
var ra = a.match(reg), rb = b.match(reg);
if (ra[1] === rb[1]) { return (+ra[2]) - (+rb[2]); }
return (+ra[1]) - (+rb[1]);
}
var objs = array.reduce(function (bundle, item) {
var number = item.split("-")[0];
bundle[number] = bundle[number] || [];
bundle[number].push(item);
return bundle;
}, {});
for (var prop in objs) {
var last = objs[prop].sort(sort).pop();
array.splice(array.indexOf(last), 1);
}
return array;
}
console.log(getFilteredArray(array));
這是最快的方法! – baao
它改變了順序。 –