所有当前的解决方案都假定数字为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*)$/;
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) );