Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将项目放置在数组的开头_Javascript_Jquery_Arrays_Sorting_Selection - Fatal编程技术网

Javascript 将项目放置在数组的开头

Javascript 将项目放置在数组的开头,javascript,jquery,arrays,sorting,selection,Javascript,Jquery,Arrays,Sorting,Selection,我得到了一个select元素,包含多个项目。我应该将以“u”开头的值按字母顺序放在列表的开头。我试着用unshift()JavaScript方法来做,但没有成功。还有别的办法吗 html: 如您所见,它会对所有值进行置乱,并丢失对不带“.”的值的引用。按字母顺序来说,下划线已经优先于其他字符,并将使用通用的.sort()方法自动放在前面,因此这将为您提供正确的顺序: var a=[]; $('option')。每个(函数(){ a、 推送($(this.text()); }); a=a.sor

我得到了一个select元素,包含多个项目。我应该将以“u”开头的值按字母顺序放在列表的开头。我试着用unshift()JavaScript方法来做,但没有成功。还有别的办法吗

html:


如您所见,它会对所有值进行置乱,并丢失对不带“.”的值的引用。

按字母顺序来说,下划线已经优先于其他字符,并将使用通用的
.sort()
方法自动放在前面,因此这将为您提供正确的顺序:

var a=[];
$('option')。每个(函数(){
a、 推送($(this.text());
});
a=a.sort();
对于(i=0;i

_c
B
_五
A.
看看这个例子

var a=[];
$('option')。每个(函数(){
a、 推送($(this.text());
});
a、 排序();
对于(i=0;i

正如@Barmar所说的那样,。为你做这项工作吧

基于此插件,只要您的选项都是小写:

jQuery.fn.mysort = function() {
    return this.pushStack( [].sort.apply( this, arguments ), []);
};
注意:虽然已经有了
$.fn.sort
方法,但它不应该在库之外使用

$('option').mysort(function(a, b) {
    var sa = $(a).text();
    var sb = $(b).text();
    return (sa < sb) ? -1 : (sa > sb) ? 1 : 0;
}).appendTo('select');
$('option').mysort(函数(a,b){
var sa=$(a).text();
var sb=$(b.text();
回报率(sasb)?1:0;
}).appendTo('select');
这将提取
选项
标记,按内容对元素进行排序,然后简单地按新顺序将它们重新添加到
选择
元素

请使用
.map()
查看。如前所述,
.sort()
在这种情况下将为您的应用程序做一切

var a=$('option').map(函数(){
返回此.outerHTML;
}).get().sort();
$('select').html(a.join(','))

_c
B
_五
A.
C
_a

我认为这是一个干净的解决方案:

var $select = $('select');

$select.children().sort(function(a, b) {
    return a.innerHTML > b.innerHTML;
}).appendTo($select);

更新

如果您不想使用
$.fn.sort
(因为它应该只在内部使用),您可以执行以下操作:

_c
_c
_v
_v
$($select.children().get().sort(function(a, b) {
    return a.innerHTML > b.innerHTML;
})).appendTo($select);

有关LcSalazar答案的更简洁版本:

var $o = $('option');
var a = $o.map(function() { return $(this).text() }).get().sort();
$o.text(function(n) { return a[n] } );

与他的答案一样,这有一种潜在的不良行为,即它将元素保留在适当的位置,但会洗牌它们的文本值

你所期望的是:-c-vab?@brunozrk是的_你不需要做任何特别的事
a.sort()
会将
放在字母之前。问题是
a.unshift()
正在从数组中删除元素。你为什么用这个?嗯,我觉得这有点老套。它是在洗牌
选项的内容
元素,而不是洗牌元素本身。@Alnitak-我完全同意。我不想进入这件事,因为这不是问题的重点,但显然是一个有效的重点,OP应该考虑到这一点。@Alnitak-在更新的答案上检查一种奇特的方式!更好,除了:1
.sort
不是受支持的jQuery函数,2。无需
分离
-每个节点在附加后都会自动分离。如果
.sort
是一种官方支持的方法,那将非常干净。消息来源说,
$.fn.sort
是“仅供内部使用”。另一个问题是,排序可能不是确定性的,因为它只返回true或false(或者在转换回数字时返回“1”和“0”)。如果
A
,则正确的排序函数也应返回-1。
var $select = $('select');

$select.children().sort(function(a, b) {
    return a.innerHTML > b.innerHTML;
}).appendTo($select);
$($select.children().get().sort(function(a, b) {
    return a.innerHTML > b.innerHTML;
})).appendTo($select);
var $o = $('option');
var a = $o.map(function() { return $(this).text() }).get().sort();
$o.text(function(n) { return a[n] } );