GVKun编程网logo

用“ Levenshtein距离”对数组进行排序,在Javascript中具有最佳性能(数组的距离)

8

如果您想了解用“Levenshtein距离”对数组进行排序,在Javascript中具有最佳性能的相关知识,那么本文是一篇不可错过的文章,我们将对数组的距离进行全面详尽的解释,并且为您提供关于Java

如果您想了解用“ Levenshtein距离”对数组进行排序,在Javascript中具有最佳性能的相关知识,那么本文是一篇不可错过的文章,我们将对数组的距离进行全面详尽的解释,并且为您提供关于Javascript - 基于另一个数组对数组进行排序、javascript – 按其相对位置对数组进行排序、javascript – 按字母顺序对字符串数组进行排序,然后按特殊字符对数字进行排序、javascript – 根据JSON Response中的时间戳值对数组进行排序的有价值的信息。

本文目录一览:

用“ Levenshtein距离”对数组进行排序,在Javascript中具有最佳性能(数组的距离)

用“ Levenshtein距离”对数组进行排序,在Javascript中具有最佳性能(数组的距离)

所以我有一个随机的javascript名称数组…

[@ larry,@ nicholas,@ notch]等

它们都以@符号开头。我想按Levenshtein距离对它们进行排序,以使列表顶部的那些最接近搜索词。目前,我有一些使用jQuery的javascript,.grep()它使用javascript
.match()方法在按键时输入的搜索词周围:

(自首次发布以来编辑的代码)

limitArr = $.grep(imTheCallback,function(n){
    return n.match(searchy.toLowerCase())
});
modArr = limitArr.sort(levenshtein(searchy.toLowerCase(),50))
if (modArr[0].substr(0,1) == '@') {
    if (atRes.childred('div').length < 6) {
        modArr.forEach(function(i){
            atRes.append('<div>' + i + '</div>');
        });
    }
} else if (modArr[0].substr(0,1) == '#') {
    if (tagRes.children('div').length < 6) {
        modArr.forEach(function(i){
            tagRes.append('<div>' + i + '</div>');
        });
    }
}

$('.oneResult:first-child').addClass('active');

$('.oneResult').click(function(){
    window.location.href = 'http://hashtag.ly/' + $(this).html();
});

它还具有一些if语句,用于检测数组是否包含井号(#)或提及(@)。不用管
imTheCallback是名称的阵列,或者主题标签或提及,然后modArr是阵列排序。然后.atResults.tagResults元素是它每次在数组中附加到的元素,这将基于输入的搜索词形成一个名称列表。

有Levenshtein距离算法:

var levenshtein = function(min,split) {
    // Levenshtein Algorithm Revisited - WebReflection
    try {
        split = !("0")[0]
    } catch(i) {
        split = true
    };

    return function(a,b) {
        if (a == b)
            return 0;
        if (!a.length || !b.length)
            return b.length || a.length;
        if (split) {
            a = a.split("");
            b = b.split("")
        };
        var len1 = a.length + 1,len2 = b.length + 1,I = 0,i = 0,d = [[0]],c,j,J;
        while (++i < len2)
            d[0][i] = i;
        i = 0;
        while (++i < len1) {
            J = j = 0;
            c = a[I];
            d[i] = [i];
            while(++j < len2) {
                d[i][j] = min(d[I][j] + 1,d[i][J] + 1,d[I][J] + (c != b[J]));
                ++J;
            };
            ++I;
        };
        return d[len1 - 1][len2 - 1];
    }
}(Math.min,false);

如何在当前代码中使用算法(或类似算法)对它进行排序,而不会降低性能呢?

更新:

所以我现在正在使用James Westgate的Lev Dist函数。快速运行WAYYYY。因此性能得以解决,现在的问题是将其与源一起使用…

modArr = limitArr.sort(function(a,b){
    levDist(a,searchy)
    levDist(b,searchy)
});

我现在的问题是对使用该.sort()方法的一般理解。感谢您的帮助,谢谢。

谢谢!

Javascript - 基于另一个数组对数组进行排序

Javascript - 基于另一个数组对数组进行排序

是否可以对如下所示的数组进行排序和重新排列:

itemsArray = [ 
    ['Anne','a'],['Bob','b'],['Henry',['Andrew','d'],['Jason','c'],['Thomas','b']
]

匹配这个数组的排列:

sortingArr = [ 'b','c','b','a','d' ]

不幸的是,我没有任何 ID 可以跟踪。我需要优先考虑 items-array 以匹配 sortArr 尽可能接近。

更新:

这是我正在寻找的输出:

itemsArray = [    
    ['Bob','b']
    ['Anne',]

知道如何做到这一点吗?

javascript – 按其相对位置对数组进行排序

javascript – 按其相对位置对数组进行排序

示例对象数组:
[{
    id: 'a',beforeId: null
},{
    id: 'b',beforeId: 'c'
},{
    id: 'c',beforeId: 'a'
},{
    id: 'd',beforeId: 'b'
}]

输出顺序:d-b-c-a;每个元素基于其beforeId属性相对于每个其他元素进行排序.

我可以创建一个临时数组并对上面的数组进行排序.是否可以使用array.sort进行排序?

解决方法

您可以使用关系构建一个对象,并通过使用带有beforeId:null的对象生成结果,并取消移动结果数组的所有对象.

下一个对象是以实际val为键的对象.

复杂性:O(2n).

function chain(array) {
    var o = {},pointer = null,result = [];

    array.forEach(a => o[a.beforeId] = a);

    while (o[pointer]) {
        result.unshift(o[pointer]);
        pointer = o[pointer].val;
    }

    return result;
}

var data = [{ val: 'a',beforeId: null },{ val: 'b',beforeId: 'c' },{ val: 'c',beforeId: 'a' },{ val: 'd',beforeId: 'b' }];

console.log(chain(data));
.as-console-wrapper { max-height: 100% !important; top: 0; }

javascript – 按字母顺序对字符串数组进行排序,然后按特殊字符对数字进行排序

javascript – 按字母顺序对字符串数组进行排序,然后按特殊字符对数字进行排序

给定以下字符串数组,我一直尝试自然地对a-z字符串进行排序,然后是数字字符串,最后是特殊字符.

nextSearchTerms = ["T","D","I","C","Y","O","4","K","N","800","S","1","V","(","10","'","`","B","M","[","-"," ","J","U","H","G","R","E","P"];
    console.log(nextSearchTerms);

    Array.prototype.naturalSort = function(){
        var a,b,a1,b1,rx=/(\d+)|(\D+)/g,rd=/\d+/;
        return this.sort(function(as,bs){
            a= String(as).toLowerCase().match(rx);
            b= String(bs).toLowerCase().match(rx);
            while(a.length && b.length){
                a1= a.shift();
                b1= b.shift();
                if (rd.test(a1) || rd.test(b1)){
                    if(!rd.test(a1)) return -1;
                    if(!rd.test(b1)) return 1;
                    if(a1 != b1) return a1-b1;
                }
                else if (a1 != b1) {
                    var aIsLetter = a1[0].charat(0).match(/[a-z]/i),bIsLetter = b1[0].charat(0).match(/[a-z]/i);
                    if (aIsLetter && !bIsLetter) return -1;
                    if (!aIsLetter && bIsLetter) return 1;
                    return (a1[0] == b1[0] ? 0 : (a1[0] < b1[0] ? -1 : 1));
                }
            }
            return a.length - b.length;
        });
    }
    console.log(nextSearchTerms.naturalSort());

我一直试图修改的函数返回.

[“B”,“C”,“D”,“E”,“G”,“H”,“I”,“J”,“K”,“M”,“N”,“O”,“ P“,”R“,”S“,”T“,”U“,”V“,”Y“,”“,”’“,”(“,” – “,”[“,”`“,“1”,“4”,“10”,“800”]

我想最终的数组输出.

[“B”,”1“,”4“,”10“,”800“,“ – ”,“[”,“`”,“”]

关于我缺少什么的任何建议?

解决方法

这是我对你所寻找的东西的刺激.我认为它比你拥有的更清洁:

Array.prototype.naturalSort = function() {
  var stringRE = /^[A-Za-z]+$/
  var numberRE = /^[\d]+$/
  return this.sort(function(a,b) {
    var aIsstring = stringRE.test(a);
    var bIsstring = stringRE.test(b)
    var aIsNumeric = numberRE.test(a);
    var bIsNumeric = numberRE.test(b);
    if (aIsstring && bIsstring) {
      return a.localeCompare(b);
    } else if (aIsNumeric && bIsNumeric) {
      return parseInt(a,10) - parseInt(b,10);
    } else if (aIsstring && bIsNumeric) {
      return -1;
    } else if (aIsNumeric && bIsstring) {
      return 1;
    } else if (aIsstring || aIsNumeric) {
      return -1;
    } else if (bIsstring || bIsNumeric) {
      return 1;
    } else {
      return a.localeCompare(b);
    }
  })
};

var chars = ["T","P"];

console.log(chars.naturalSort());
// ["B","P","T","`"]

javascript – 根据JSON Response中的时间戳值对数组进行排序

javascript – 根据JSON Response中的时间戳值对数组进行排序

我在我的json响应中有时间戳值,并且能够正确地解析该值.
每个图像都有自己的时间戳值,我需要在增加的时间戳值中显示它.这意味着应该首先在我的应用程序中加载最后更新的图像.

时间戳在JSON响应中采用以下格式:

Brand1{
"FileName": "520120427043622011.jpg","UpdateTimeStamp": "Jun 10,2013 8:31:23 AM"
}

Brand2{
"FileName": "Kung_Fu_Fingers.jpg","UpdateTimeStamp": "Jun 5,2013 6:51:12 AM"
}

Brand3{
"FileName": "google_logo1.jpg",2013 8:31:23 AM"
}

任何人都可以指导我使用Javascript或jQuery函数根据时间戳值对上述三个品牌图像项进行排序.
我在分割dat值后使用了sort函数,但它只按字母顺序对月份进行排序.
请帮我找到解决方案.

提前致谢.

解决方法

你可以定义insert-sort,它在O(n)-time中执行(最好的情况是,数组被排序),而O(n ^ 2)数组没有排序(最坏的情况):

function insertionSort(files,attrToSortBy){
  for(var k=1; k < files.length; k++){
     for(var i=k; i > 0 && new Date(files[i][attrToSortBy]) < 
       new Date(files[i-1][attrToSortBy]); i--){

        var tmpFile = files[i];
        files[i] = files[i-1];
        files[i-1] = tmpFile;

     }
  }

}

var files = [{
     "FileName": "520120427043622011.jpg",2013 8:31:23 AM"
   },{
     "FileName": "Kung_Fu_Fingers.jpg",2013 6:51:12 AM"
   },{
     "FileName": "google_logo1.jpg","UpdateTimeStamp": "Jun 12,2013 8:31:23 AM"
}];

insertionSort(files,"UpdateTimeStamp");

console.log('files: ',files);

今天关于用“ Levenshtein距离”对数组进行排序,在Javascript中具有最佳性能数组的距离的分享就到这里,希望大家有所收获,若想了解更多关于Javascript - 基于另一个数组对数组进行排序、javascript – 按其相对位置对数组进行排序、javascript – 按字母顺序对字符串数组进行排序,然后按特殊字符对数字进行排序、javascript – 根据JSON Response中的时间戳值对数组进行排序等相关知识,可以在本站进行查询。

本文标签: