在jquery/javascript中使用分数对select进行排序

在jquery/javascript中使用分数对select进行排序,javascript,jquery,Javascript,Jquery,我想按计算出的分数对下面的select选项进行排序,不包括--please select--选项 使用对象进行最新编辑。 下面是: var els = new Array(); var counter = 0; $j("select.wpsc_select_variation option").each(function(index, ele){ var obj = new Object; var i = $j(ele).text(); i = i.replace("\"", ""); i =

我想按计算出的分数对下面的select选项进行排序,不包括--please select--选项

使用对象进行最新编辑。 下面是:

var els = new Array();
var counter = 0;
$j("select.wpsc_select_variation option").each(function(index, ele){
var obj = new Object;
var i = $j(ele).text();
i = i.replace("\"", "");
i = i.replace("''", "");
if (i.indexOf("-") >= 0){
    i = i.split('-');
    split = i[1].split('/');
    i = eval(i[0]) + split[0] / split[1];
}
else if(i.indexOf("/") >= 0){
    split = i.split('/');
    i = split[0] / split[1];
}
i = eval(i);
obj.ind = i;
obj.ele = ele;
els[counter] = obj;
counter++;
});
els.sort(function (a, b) { return parseInt(a.ind) - parseInt(b.ind) });
console.log(els);
上述结果如下:

[Object { ind=NaN,  ele=option}, Object { ind=0.75,  ele=option}, Object { ind=0.375,  ele=option}, Object { ind=0.625,  ele=option}, Object { ind=0.5,  ele=option}, Object { ind=1,  ele=option}, Object { ind=1.5,  ele=option}, Object { ind=1.25,  ele=option}, Object { ind=1.75,  ele=option}, Object { ind=2,  ele=option}]
它似乎在某种程度上对它们进行排序,但正如您所看到的,它们仍然是无序的。

由于选项值已经按照您所需的顺序排列,您可以只对这些值进行排序:

$($(".select_variation option").get().sort(function (a, b) {
    return parseInt(a.value) - parseInt(b.value);
})).appendTo(".select_variation");

下面的JSFIDLE解决了这个问题。这要归功于ExplosionPills的全面帮助,以及Kolink帮助我发现更多关于阵列的信息。感谢这里的vol7ron:
感谢他在函数方面的帮助。 谢谢大家

function sortByRationalValue (a,b){
        return a.rationalValue - b.rationalValue;
    }
function returnObjectFromMeasurements(element, text) {
    var obj = {},
        range = text.replace(/["'”″]/g, '').split('-'),
        rational;

    if (range.length > 1)
        rational = eval(range[0]) + eval(range[1]);
    else
        rational = eval(range[0]);

    obj.rationalValue = rational;
    obj.element       = element;
    return obj;
}
jQuery(document).ready(function( $ ) {
    $(".wpsc_select_variation").each(function (index, element) {
        var els = new Array();
        var counter = 0;
        var children = $(element).children();
        $(children).each(function (index, ele) {
            els[index] = returnObjectFromMeasurements(ele, $(ele).text());
        });
        els.sort(sortByRationalValue);
        var elements = new Array();
        $.each(els, function (index, value) {
            elements[index] = value.element;
        });
        $(this).html(elements);
    });
});

我意识到这段代码可能有点慢,通常需要一些增强功能。如果您认为有改进的余地,请随意无耻地破解我的代码。非整数密钥无效。相反,它们被视为字符串,并应用为对象属性的键,而不是数组索引。它们的值似乎按顺序排列:Holy cow@ExplosionPills-我知道我应该先到这里。您的解决方案完全不需要我的任何代码。你能把它变成一个解决方案让我接受吗?@Kolink-我想我明白你的意思了。那么,我上面发布的代码完全没有价值吗?谢谢你的解决方案。我遇到了一个小问题-同一个pge上有多个select,同一个类需要应用相同的逻辑。@JoshLevinson将其包装在
中。selects上的每个
回调。如果它们没有按顺序排列,那么我想我们将不得不做更多的工作,按文本排序,这首先给你带来了很多麻烦。我们可以在另一个问题中解决这个问题,如果这些值不符合顺序,那该怎么办?这是一个由posts(WordPress)生成的下拉列表,可能并不总是以相同的顺序生成。帖子在创建时按顺序编号。选项值是post id的值。例如,我可能会为1“创建一个帖子,然后回来为3/8”创建一个帖子。然后,3/8“的post id将大于1”。@JoshLevinson我将不得不重写排序方法,以便根据文本解析十进制值;给我一点…@JoshLevinson你不能对一个对象进行排序,因为它的成员不是有序的。您可以做的是拥有如下对象数组:
[{'text':optionText,'elem':optionElement}].sort(函数(a,b){return parseInt(a.text)-parseInt(b.text));}这当然假设
text
是可排序的值
$($(".select_variation option").get().sort(function (a, b) {
    return parseInt(a.value) - parseInt(b.value);
})).appendTo(".select_variation");
function sortByRationalValue (a,b){
        return a.rationalValue - b.rationalValue;
    }
function returnObjectFromMeasurements(element, text) {
    var obj = {},
        range = text.replace(/["'”″]/g, '').split('-'),
        rational;

    if (range.length > 1)
        rational = eval(range[0]) + eval(range[1]);
    else
        rational = eval(range[0]);

    obj.rationalValue = rational;
    obj.element       = element;
    return obj;
}
jQuery(document).ready(function( $ ) {
    $(".wpsc_select_variation").each(function (index, element) {
        var els = new Array();
        var counter = 0;
        var children = $(element).children();
        $(children).each(function (index, ele) {
            els[index] = returnObjectFromMeasurements(ele, $(ele).text());
        });
        els.sort(sortByRationalValue);
        var elements = new Array();
        $.each(els, function (index, value) {
            elements[index] = value.element;
        });
        $(this).html(elements);
    });
});