Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.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_Sorting_Unicode_Collation_Alphabet - Fatal编程技术网

Javascript 准备数组以便在闭包中排序

Javascript 准备数组以便在闭包中排序,javascript,sorting,unicode,collation,alphabet,Javascript,Sorting,Unicode,Collation,Alphabet,根据我的研究和谷歌搜索,Javascript似乎缺乏对区域设置感知排序和字符串比较的支持。确实存在,但是显式地设置所使用的语言环境是不可能的(操作系统语言环境并不总是想要的)。有一些,但在此之前,我们只能靠自己。根据不同浏览器的结果的一致性,我们可能永远是一个人:( 我有下面的代码,它使字母排序成为一个数组。它使速度铭记在心,并从中获得了想法,我对其进行了一些速度改进 在这个例子中,单词数组有13个成员,sort函数被调用了34次。我想替换单词数组中的一些字母(你不必知道替换了什么,因为这不是问

根据我的研究和谷歌搜索,Javascript似乎缺乏对区域设置感知排序和字符串比较的支持。确实存在,但是显式地设置所使用的语言环境是不可能的(操作系统语言环境并不总是想要的)。有一些,但在此之前,我们只能靠自己。根据不同浏览器的结果的一致性,我们可能永远是一个人:(

我有下面的代码,它使字母排序成为一个数组。它使速度铭记在心,并从中获得了想法,我对其进行了一些速度改进

在这个例子中,单词数组有13个成员,sort函数被调用了34次。我想替换单词数组中的一些字母(你不必知道替换了什么,因为这不是问题的重点)。如果我在sort函数中进行这些替换(以
返回函数(a,b)开头的那一个)
),代码效率低下,因为每个数组成员都要进行多次替换。当然,我可以在闭包之外进行这些替换,我的意思是在
words.sort(sortbyalphabet_timo);
行之前,但这不是我想要的

问题1:是否可以修改“准备开始”和“准备结束”行之间的单词数组,以便排序函数使用修改后的单词数组

问题2:是否可以在闭包中输入参数,以便准备开始和准备结束之间的代码可以使用它们?我尝试过这个方法但没有成功:

var caseinsensitive = true;
words.sort( sortbyalphabet_timo(caseinsensitive) );
最后是代码示例,准备运行的示例如下所示:

var sortbyalphabet_timo=(函数(){
//准备工作开始了
变量i,字母表=“-0123456789AaÀ195ÄBbCcçDdEeÈ202;ËFfGgHhIiÌ236çjkkllmnnçOoçç245;çppqrssttuuç,
索引={};
i=字母表长度;
而(i--)索引[字母表.charCodeAt(i)]=i;
//准备结束
返回函数(a,b){
变量i,len,diff;
如果(a的类型==“字符串”&&b的类型==“字符串”){
(a.长度>b.长度)?len=a.长度:len=b.长度;
对于(i=0;i
是否可以修改“准备开始”和“准备结束”行之间的单词数组,以便排序函数使用修改后的单词数组

不,不是真的。您没有访问数组本身的权限,您的函数只生成比较函数,该函数稍后在数组上调用
.sort
时使用。如果您需要更改数组,则需要编写一个函数,将其作为参数;例如,您可以在
数组.prototype
上添加一个方法。它将像

function mysort(arr) {
    // Preparation
    // declaration of compare function
    // OR execution of closure to get the compare function
    arr.sort(comparefn);
    return arr;
}
是否可以向闭包输入参数,以便准备开始和准备结束之间的代码可以使用它们

是的,当然-这就是使用闭包的原因:-)但是,不能对当前代码使用
sortbyalphabet\u timo(不区分大小写)
。您拥有的闭包会立即被调用(称为IIFE)并返回比较函数,您可以像在演示中一样将其传递到sort中

如果希望
sortbyalphabet\u timo
作为闭包而不是结果,则必须删除它后面的括号。您还可以在那里使用参数,这些参数可以在整个闭包范围(包括comparefunction)中访问:

目前,您正在执行以下操作:

var sortbyalphabet_timo_closure = function(/*having no arguments*/) {
    // Preparation, potentially using the arguments
    // Declaration of compare function, potentially using the arguments
    return comparefn;
}
var sortbyalphabet_timo = sortbyalphabet_timo_closure();
// then use
words.sort(sortbyalphabet_timo);

…如果需要多次排序,它只缓存执行闭包的结果。

您有一个非常有趣的字母表。是吗?该功能的目的是,用户可以添加任何他/她想要的字母表。这只是一个可能的字符顺序的示例。请用你想要的。谢谢!为什么你的非关闭方案比关闭方案慢?闭包版本大约快25倍(在Safari中是198倍):嗯,您没有传递比较函数,而是将闭包传递到
sort()
。我认为,从这一点可以明显看出,为什么一个人(稍微)更快。这个答案值得+1,因为我们在这里找到了我问题背后的真相。我问“可能吗”,但真正的意思是“我怎样才能实现它”。我怎样才能得到所有这些:闭包版本的速度(所以如果不需要,什么都不做多次),使用参数选择例如不敏感,并在排序之前修改单词数组?我需要一些不可能的东西吗?是的。使用参数和缓存闭包结果的速度有点矛盾。修改数组与闭包无关。修改单词数组当然可以在闭包之外完成。如果我们想使排序不敏感,我们可以将数组成员转换为小写或大写;如果我们想使排序重音不敏感,我们可以将所有重音转换为非重音。
var sortbyalphabet_timo_closure = function(caseinsensitive) {
    // Preparation, potentially using the arguments
    // Declaration of compare function, potentially using the arguments
    return comparefn;
}
// then use
words.sort(sortbyalphabet_timo_closure(true));
var sortbyalphabet_timo_closure = function(/*having no arguments*/) {
    // Preparation, potentially using the arguments
    // Declaration of compare function, potentially using the arguments
    return comparefn;
}
var sortbyalphabet_timo = sortbyalphabet_timo_closure();
// then use
words.sort(sortbyalphabet_timo);