【问题标题】:How to compare 2 Arrays to update key value pairs in one?如何比较 2 个数组以更新键值对?
【发布时间】:2015-04-29 19:08:11
【问题描述】:

我有一个主要的标签数组

var tagsArray = [
    {
        name: "1",
        selected: undefined
    },
    {
        name: "2",
        selected: undefined
    },
    {
        name: "3",
        selected: undefined
    }
]

然后是一组选定的标签来比较它:

var selectedTags = [
    {
        name: "1",
        selected: true
    }
]

您将如何运行某种比较(for-loop)来检查 selectedTags 中的哪些对象具有 selected: true 值?

然后还要将tagsArray中相同对象的selected值设置为true

【问题讨论】:

    标签: javascript arrays for-loop


    【解决方案1】:

    创建一个访问映射,然后迭代并找到true 值并将值设置在另一个数组中

    var map = {};
    
    tagsArray.forEach(function(obj, index) {
        map[obj.name] = index;
    });
    
    selectedTags.forEach(function(obj) {
        if ( obj.selected ) {
            tagsArray[map[obj.name]].selected = true;
        }
    });
    

    FIDDLE

    【讨论】:

    • 谢谢!忘了map,这太干净了,我试图让它与几个for循环一起工作。
    【解决方案2】:

    您仍然可以使用 2 个 for 循环,并且在代码或清晰度方面看起来并没有差多少。但平均而言,它的运行速度比使用 map 慢 O(n^2)。

    var i,j;
    
    for(i = 0; i < tagsArray.length; i++){
        for(j = 0; j < selectedTags.length; j++){
            if(tagsArray[i].name === selectedTags[j].name){
                tagsArray[i].selected = true;
                break;
            }
        }
    }
    

    JS Fiddle

    【讨论】:

    • 感谢您的提示!我猜mapswitch-case 语句的工作方式相同,因为它可以更快地找到需要的内容?
    • 不客气!地图专为快速数据查找而设计。因此,例如,它不是使用整个内部循环来匹配从 tagsArray 到 selectedTags 数组的名称,而是使用一种不同的方法,使用更少的时间来找到相同的匹配项。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 2018-01-25
    • 1970-01-01
    • 2019-09-26
    • 1970-01-01
    相关资源
    最近更新 更多