在jquery/javascript中使用分数对select进行排序
我想按计算出的分数对下面的select选项进行排序,不包括--please 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 =
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);
});
});