代码之家  ›  专栏  ›  技术社区  ›  anish anil

在javascript中迭代嵌套数组

  •  3
  • anish anil  · 技术社区  · 6 年前

    我尝试遍历嵌套数组,但在提取正确的值时遇到问题。

    我的JSON文件

    var regions = [
    {
        "id": 265592,
        "longName": "Amsterdam 1",
        "name": "ams01",
        "statusId": 2,
        "regions": [
            {
                "description": "AMS01 - Amsterdam",
                "keyname": "AMSTERDAM",
                "sortOrder": 0
            }
        ]
    },
    {
        "id": 814994,
        "longName": "Amsterdam 3",
        "name": "ams03",
        "statusId": 2,
        "regions": [
            {
                "description": "AMS03 - Amsterdam",
                "keyname": "AMSTERDAM03",
                "sortOrder": 26
            }
        ]
    },
    {
        "id": 1004997,
        "longName": "Chennai 1",
        "name": "che01",
        "statusId": 2,
        "regions": [
            {
                "description": "CHE01 - Chennai ",
                "keyname": "CHENNAI",
                "sortOrder": 30
            }
        ]
    },
    

    我只想将区域数组中的键名提取到数组中。

    我的代码可以正常工作,并为我提供输出:

    const regions3 = []
    for (let i = 0; i < regions.length; i++) {
        const element = regions[i]; 
        const regions1 = (element.regions)
        for (let j = 0; j < regions1.length; j++) {
            const element1 = regions1[j];
            const element2 = element1.keyname;
            regions3.push(element2)
            console.log(regions3)
        }
    }
    

    产量

    AMSTERDAM
    AMSTERDAM03
    CHENNAI
    

    我想知道是否有更快的迭代方法,而不是把它分成两个for循环??

    谢谢你

    4 回复  |  直到 6 年前
        1
  •  2
  •   guest271314    6 年前

    你可以使用 .map() 和破坏任务

    var regions = [{"id":265592,"longName":"Amsterdam 1","name":"ams01","statusId":2,"regions":[{"description":"AMS01 - Amsterdam","keyname":"AMSTERDAM","sortOrder":0}]},{"id":814994,"longName":"Amsterdam 3","name":"ams03","statusId":2,"regions":[{"description":"AMS03 - Amsterdam","keyname":"AMSTERDAM03","sortOrder":26}]},{"id":1004997,"longName":"Chennai 1","name":"che01","statusId":2,"regions":[{"description":"CHE01 - Chennai ","keyname":"CHENNAI","sortOrder":30}]}];
    
    let res = regions.map(({regions: [{keyname}]}) => keyname);
    
    console.log(res);
        2
  •  5
  •   Ori Drori    6 年前

    你可以使用 Array.flatMap() (在IE/EDGE中不支持)具有 Array.map() :

    const regions = [{"id":265592,"longName":"Amsterdam 1","name":"ams01","statusId":2,"regions":[{"description":"AMS01 - Amsterdam","keyname":"AMSTERDAM","sortOrder":0}]},{"id":814994,"longName":"Amsterdam 3","name":"ams03","statusId":2,"regions":[{"description":"AMS03 - Amsterdam","keyname":"AMSTERDAM03","sortOrder":26}]},{"id":1004997,"longName":"Chennai 1","name":"che01","statusId":2,"regions":[{"description":"CHE01 - Chennai ","keyname":"CHENNAI","sortOrder":30}]}]
    
    const result = regions.flatMap(o =>
      o.regions.map(p => p.keyname)
    )
    
    console.log(result)

    如果你不能使用 数组FLAMP() 您可以使用外部 数组() spread 结果转化为 Array.concat() 而是:

    const regions = [{"id":265592,"longName":"Amsterdam 1","name":"ams01","statusId":2,"regions":[{"description":"AMS01 - Amsterdam","keyname":"AMSTERDAM","sortOrder":0}]},{"id":814994,"longName":"Amsterdam 3","name":"ams03","statusId":2,"regions":[{"description":"AMS03 - Amsterdam","keyname":"AMSTERDAM03","sortOrder":26}]},{"id":1004997,"longName":"Chennai 1","name":"che01","statusId":2,"regions":[{"description":"CHE01 - Chennai ","keyname":"CHENNAI","sortOrder":30}]}]
    
    const result = [].concat(...regions.map(o =>
      o.regions.map(p => p.keyname)
    ))
    
    console.log(result)
        3
  •  2
  •   Shidersz    6 年前

    另一个解决方案是使用 Array::reduce() :

    var regions = [{"id":265592,"longName":"Amsterdam1","name":"ams01","statusId":2,"regions":[{"description":"AMS01-Amsterdam","keyname":"AMSTERDAM","sortOrder":0}]},{"id":814994,"longName":"Amsterdam3","name":"ams03","statusId":2,"regions":[{"description":"AMS03-Amsterdam","keyname":"AMSTERDAM03","sortOrder":26}]},{"id":1004997,"longName":"Chennai1","name":"che01","statusId":2,"regions":[{"description":"CHE01-Chennai","keyname":"CHENNAI","sortOrder":30}]}];
    
    let res = regions.reduce(
        (acc, curr) => (curr.regions.forEach(x => acc.push(x.keyname)), acc),
        []
    );
    
    console.log(res);
        4
  •  0
  •   Saad Siddiqui    6 年前

    这几乎是一样的,但是在javascript中使用foreach方法或数组类型可以节省一些时间。下面是一个例子。

    const regions3 = [];
            regions.forEach(function(region){
                region.regions.forEach(function(subRegion){
                    regions3.push(subRegion.keyname);
                    console.log(subRegion.keyname);
                })
            });
    

    foreach执行一个匿名函数,将数组中的每个元素作为参数传递给匿名函数。