首页 > 解决方案 > 如何从数组本身重构数组?

问题描述

我的数组是:

源阵列

[{
        "Id": 1891,
        "AirportCode": "DUB",
        "AirportName": "Dublin Airport",
        "AirportCity": "Dublin",
        "Priority": 1,
        "SubPriority": 0
    },
    {
        "Id": 1921,
        "AirportCode": "DXB",
        "AirportName": "Dubai International Airport",
        "AirportCity": "Dubai",
        "Priority": 1,
        "SubPriority": 0
    },
    {
        "Id": 1680,
        "AirportCode": "DBN",
        "AirportName": "Dublin Municipal Airport",
        "AirportCity": "Dublin",
        "Priority": 2,
        "SubPriority": 1
    },
    {
        "Id": 8973,
        "AirportCode": "XNB",
        "AirportName": "United Arab Emirates - Bus Station",
        "AirportCity": "Dubai",
        "Priority": 2,
        "SubPriority": 1
    },
    {
        "Id": 6062,
        "AirportCode": "PSK",
        "AirportName": "New River Valley Airport",
        "AirportCity": "Dublin",
        "Priority": 3,
        "SubPriority": 1
    },
    {
        "Id": 1681,
        "AirportCode": "DBO",
        "AirportName": "Dubbo Airport",
        "AirportCity": "Dubbo",
        "Priority": 99,
        "SubPriority": null
    }
]

我希望它像 -

预期输出

我编写了如下函数,因为 AirportCity 是相同的,并且 SubPriority 不为空

const customAirports = [];
        myArray.map((val, i, arr) => {
            let pushedInSubAirport = false;
            for (let v of customAirports) {
                if (v.AirportCity === (val.SubPriority ?
                    val.AirportCity : undefined)
                ) {
                    if (!v['SubAirport'])
                        Object.assign(v, { SubAirport: [] })
                    v['SubAirport'].push(val);
                    pushedInSubAirport = true;
                    break;
                }
            }
            if (!pushedInSubAirport)
                customAirports.push(val)
        });
        myArray = customAirports;

如果不合适,请建议我解决方案。

标签: javascriptarraysjsonangulartypescript

解决方案


另一种方式

this.airports.sort((a,b)=>a.Priority-b.Priority) //sort by priority
    this.airports.forEach((x,index)=>{
      const airport=this.airports.find( //try find one more on top
          (a,index2)=>a.AirportCity==x.AirportCity && index>index2)
      if (airport) //if exist
      {
        if (!airport.SubAirport) //if has not SubAirport
            airport.SubAirport=[{...x}]  //create an array with one element
        else
          airport.SubAirport.push({...x}) //add to array

        x.remove=true; //mark as "removable"
      }

    })
    this.airports=this.airports.filter(x=>!x.remove) //<--remove the removable

堆栈闪电战


推荐阅读