【问题标题】:Fastest way to match elements from two JavaScript arrays从两个 JavaScript 数组中匹配元素的最快方法
【发布时间】:2015-11-27 03:41:58
【问题描述】:

我正在尝试使用 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 个左右的元素,这将需要一些计算时间。另外为了避免阻塞页面,我将所有这些任务委托给了一个网络工作者。

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

【问题讨论】:

  • var keys = json1.map(function (e) { return e.name; }); var common = json2.filter(function (e) { return keys.indexOf(e.name) &gt; -1; });
  • 由于第二个数组已排序,您可以使用任意数量的搜索算法来匹配名称并添加,从而将计算时间减少到对数规模。
  • 如果您谈论的是 100 个元素,那么计算时间不太可能成为问题。您是否对此进行了基准测试以确保它确实是一个问题?
  • @torazaburo 你能告诉我为什么这不会是一个问题,或者你能引用一个我可以从中学习的链接。谢谢
  • 您知道它是否会成为问题的方法是对其进行基准测试。假设在最坏的情况下您正在进行 100 x 100 = 10,000 次比较。假设每次比较需要一微秒。因此,所有比较都需要 10 毫秒——换句话说,您可以在 1/100 秒内完成所有 10,000 次比较。您可以根据您的特定应用程序来判断这是否是一个问题。

标签: javascript arrays


【解决方案1】:

如果你不关心循环后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; 
        }
    }
}

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

【讨论】:

    猜你喜欢
    • 2018-09-08
    • 2011-12-09
    • 2021-02-24
    • 1970-01-01
    • 1970-01-01
    • 2011-09-25
    • 2014-12-07
    • 1970-01-01
    • 2017-07-07
    相关资源
    最近更新 更多