【发布时间】:2013-07-07 21:05:18
【问题描述】:
我正在使用的电子商务平台无法对我们的产品属性字段的选项进行重新排序。这真的很糟糕,因为要插入一个新选项,您几乎必须删除所有现有选项并重新开始。我正在尝试在客户端进行。这是我正在使用的东西(这个是鞋码):
- 9 EE
- 9 1/2 EE
- 10 EE
- 10 1/2 EE
- 11 EE
- 11 1/2 EE
- 9 EEEE
- 9 1/2 天
- 9 1/2 EEEE
- 10 EEEE
- 10 1/2 EEEE
- 11 EEEE
- 9 天
- 11 1/2 EEEE
这些实际上是一些<option>s 的文本形式。值的格式为X Y Z,其中:
-
X是一个整数 -
Y是字符串“1/2”,可能不存在 -
Z是一个字母代码,可以是“D”、“E”、“EEE”或“EEEE”,可能不存在
上面的期望顺序是这样的:
- 9 天
- 9 1/2 天
- 9 EE
- 9 1/2 EE
- 9 EEEE
- 9 1/2 EEEE
- 10 EE
- 10 1/2 EE
- 10 EEEE
- 10 1/2 EEEE
- 11 EE
- 11 1/2 EE
- 11 EEEE
- 11 1/2 EEEE
我对 javascript 的 sort() 函数有所了解,但无法完全理解您可以传递给它的比较函数是如何工作的。到目前为止我已经得到了这个:
<select>
<option>9 EE</option>
<option>9 1/2 EE</option>
<option>10 EE</option>
<option>10 1/2 EE</option>
<option>11 EE</option>
<option>11 1/2 EE</option>
<option>9 EEEE</option>
<option>9 1/2 D</option>
<option>9 1/2 EEEE</option>
<option>10 EEEE</option>
<option>10 1/2 EEEE</option>
<option>11 EEEE</option>
<option>9 D</option>
<option>11 1/2 EEEE</option>
</select>
我从这个答案中的代码开始:https://stackoverflow.com/a/667198/398242
$("select").html($("option").sort(function (a, b) {
return a.text == b.text ? 0 : a.text < b.text ? -1 : 1
}));
像这样对项目进行排序(甚至不适用于第一个条件):
- 10 1/2 EE
- 10 1/2 EEEE
- 10 EE
- 10 EEEE
- 11 1/2 EE
- 11 1/2 EEEE
- 11 EE
- 11 EEEE
- 9 1/2 天
- 9 1/2 EE
- 9 1/2 EEEE
- 9 天
- 9 EE
- 9 EEEE
我在 javascript 中看到 '11' > '9' 返回 false,这对我来说毫无意义。
MDN describes the compare function argument 这样,我有点明白:
function compare(a, b) {
if (a is less than b by some ordering criterion)
return -1;
if (a is greater than b by the ordering criterion)
return 1;
// a must be equal to b
return 0;
}
...但我不知道如何调整它以满足我的要求。我已经尝试了一些东西,但我只是觉得我在黑暗中拍摄。我试图表明我花了一些时间来尝试理解这个问题。我有兴趣了解更多信息,但现在我只想解决这个问题。
【问题讨论】:
-
我认为这里的解决方案是以某种方式将
a和b标准化为\d\d (1/2|0/0) [a-z]*这样的格式,然后再进行比较 -
"11" > "9" === false非常有意义。您正在比较 字符串。尝试先转换为数字 -
@Ian 我知道它们是字符串,但 11 是比 9 更长的字符串,数值无关紧要。是因为它只看第一个字符吗?发生了什么,正在比较什么?我不知道如何将这些值转换为数字。
-
@WesleyMurch:比较字符串和字符串长度是两件不同的事情。以“蝙蝠”和“杏”这两个词为例。如果比较字符串长度,那么字典中的“bat”应该排在“apricot”之前。它不这样做吗?你如何比较它?想想吧。
标签: javascript jquery