Как реструктурировать массив из самого массива? - PullRequest
0 голосов
/ 19 марта 2020

Мой массив:

SOURCE ARRAY

[{
        "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
    }
]

Я хочу, чтобы это было похоже -

EXPECTED OUTPUT

Я написал эту функцию, как показано ниже: weher 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;

Если это не правильно, предложите мне решение.

Ответы [ 2 ]

1 голос
/ 19 марта 2020

Другой способ

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

stackblitz

0 голосов
/ 19 марта 2020

Обратите внимание на согласованность данных, например, null / 0.

.map вернуть другой массив, в случае, если это не так, лучше использовать .forEach

Избегайте модифицировать структуры во время итерации.

const data = [{
  "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": 0 // null - Inconsistent !!!
}];
const grouped = group(data);

window.result.innerHTML = JSON.stringify(grouped, null, 2);

function group(data){
  const [main, subs] = data.reduce(([main, subs], item) => {
    if (item.SubPriority === 0) {
      return [main.concat(item), subs];
    }
    const subList = subs.get(item.AirportCity) || [];
    subs.set(item.AirportCity, subList.concat(item));

    return [main, subs];
  }, [[], new Map()]);

  return main.map((item) => Object.assign(item, {SubAirport: subs.get(item.AirportCity) || []}));
}
<pre id="result"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...