匹配两个JavaScript数组中元素的最快方法

时间:2015-11-27 03:41:59

标签: javascript arrays

我正在尝试使用JavaScript探索数组,我遇到了一种情况,我希望匹配来自两个不同数组的元素。

第一个阵列:

json1=[{
    name:"abc",
    add:"xyz"
},{
    name:"mno",
    add :"xxy"
}]

第二个数组

json2=[{
    name:"abc",
    add:"xyz",
    off:"lop"
},{
    name:"rag",
    add:"vrt",
    off:"wwq"
},{
    name:"abc",
    add:"xyz",
    off:"lop"
},{
    name:"wal",
    add:"rot",
    off:"nim"
},{
    name:"abc",
    add:"ola",
    off:"blo"
}]

两个数组都有共同的名称值(' abc')。我循环并匹配json1的每个名称值与json2的每个名称值。

为了加快速度,我按名称对第二个数组进行了排序:

json2.sort(function(x,y){
     return x.name>y.name? 1 : x.name<y.name? -1 :0;  
});

我仍然认为它可能没那么有用,因为如果我们在每个数组中有更多数据可能是100个元素,那么将需要一些计算时间。另外,为了避免阻止页面,我已将所有这些任务委派给Web worker。

我们有什么方法可以让它更快?

1 个答案:

答案 0 :(得分:0)

如果您在使用循环后不关心json2的结果。

var match = [];
for(var indx in json1){
    var mainItem = json1[i];
    for(var mIndx = 0; mIndx < json2.length; mIndex++){
        if(json2[mIndex].name === json1[indx].name){
            match.push(json2.splice(mIndex, 1));
            mIndex--;
        }
        //this else is only used when you know that your json2 array is sorted ascendingly
        //by name property. this helps the time complexity.
        else if(json2[mIndx].name > json1[indx].name){
            break; 
        }
    }
}

您的匹配结果将在匹配变量中。 m =第一个数组的长度,n =第二个数组的长度。 当json2被排序时,时间复杂度是(m + n)。 最坏情况的复杂性是m * n,即当json2中的所有记录都是不同的并且json2没有排序时。