Я пытаюсь использовать цикл for внутри цикла for для сортировки элементов в массиве, но вместо этого некоторые значения дублируются, и я не могу определить, в чем проблема. Моя логика еще не очень развита. Я знаю, что есть функции сортировки, но это часть школьного задания, и мы должны использовать два для циклов. Я хочу, чтобы значение ключа «порядок» определяло положение массива объекта.

 var connection = await fetch('momondo.php')
  var jData = await connection.json()
  var aScheduleInOrder = jData
  for (var i = 0; i < jData.length; i++) {           

    for (var j = 0; j < jData[i].schedule.length; j++) {

      aScheduleInOrder[i].schedule[jData[i].schedule[j].order] = jData[i].schedule[j]
    }
  }

И вот объекты json внутри jData:

[  
  {     
  "currency":"DKK",
  "price":3000,
  "schedule":
  [    
    {"airlineIcon":"LH.png", "date":1581513600,"id":"SAS22","from":"C", "to":"D","waitingTime":120,"flightTime":240,"order":2},
    {"airlineIcon":"KL.png","date":1581510000, "id":"SAS33","from":"B", "to":"C","waitingTime":60,"flightTime":180,"order":1},
    {"airlineIcon":"DY.png","date":1581501600,"id":"SAS1","from":"A", "to":"B","waitingTime":0,"flightTime":80,"order":0}
  ]
},

{   
  "currency":"DKK",
  "price":5000,
  "schedule":
  [
    {"airlineIcon":"LX.png", "date":1581513600,"id":"SAS55","from":"B", "to":"C","waitingTime":120,"flightTime":240,"order":1},
    {"airlineIcon":"SK.png","date":1581501600,"id":"SAS44","from":"A", "to":"B","waitingTime":0,"flightTime":80,"order":0}

  ]
},

{     
  "currency":"DKK",
  "price":15000,
  "schedule":
  [
    {"airlineIcon":"AC.png","date":1581501600,"id":"SAS78","from":"A", "to":"B","waitingTime":0,"flightTime":80,"order":0}
  ]
}    
]

В позиции [1] в массиве, внутри массива расписания, у первого элемента в позиции [0] есть ключ с именем «заказ» со значением 1. Это должно в соответствии с моей логикой, с двумя циклами for, получить перемещен в положение [1], а второй элемент в положение [1] должен быть перемещен в положение [2] и т. д. Вот как это должно выглядеть после:

[  
  {     
  "currency":"DKK",
  "price":3000,
  "schedule":
  [
    {"airlineIcon":"DY.png","date":1581501600,"id":"SAS1","from":"A", "to":"B","waitingTime":0,"flightTime":80,"order":0},
    {"airlineIcon":"KL.png","date":1581510000, "id":"SAS33","from":"B", "to":"C","waitingTime":60,"flightTime":180,"order":1},
    {"airlineIcon":"LH.png", "date":1581513600,"id":"SAS22","from":"C", "to":"D","waitingTime":120,"flightTime":240,"order":2}
  ]
},

{   
  "currency":"DKK",
  "price":5000,
  "schedule":
  [
    {"airlineIcon":"SK.png","date":1581501600,"id":"SAS44","from":"A", "to":"B","waitingTime":0,"flightTime":80,"order":0},
    {"airlineIcon":"LX.png", "date":1581513600,"id":"SAS55","from":"B", "to":"C","waitingTime":120,"flightTime":240,"order":1}
  ]
},

{     
  "currency":"DKK",
  "price":15000,
  "schedule":
  [
    {"airlineIcon":"AC.png","date":1581501600,"id":"SAS78","from":"A", "to":"B","waitingTime":0,"flightTime":80,"order":0}
  ]
}      
]

Я надеюсь, что вы, ребята, можете помочь мне :)

2
DanielBeck 12 Фев 2020 в 12:55

2 ответа

Лучший ответ

Хорошо, ясно, вы просто хотите отсортировать атрибут порядка, а не упорядочивать элементы внутри массива? Затем добавьте следующее во второй вложенный цикл

aScheduleInOrder[i].schedule[j].order = j;

Вместо

aScheduleInOrder[i].schedule[jData[i].schedule[j].order] = jData[i].schedule[j]

РЕДАКТИРОВАТЬ . После изменения исходного вопроса мы получили новый ответ. Пожалуйста, попробуйте этот код, он создаст новый массив с нуля, ища правильный порядок планирования в исходном массиве. Также вполне читабельно с точки зрения учителя:

for (var i = 0; i < jData.length; i++) {

    var currency = jData[i].currency;
    var price = jData[i].price;
    var schedule = [];

    var data = {
        "currency": currency,
        "price":    price,
        "schedule" : []
    };

    for (var j = 0; j < jData[i].schedule.length; j++) {
        data.schedule[j] = getScheduleByOrder(jData[i].schedule,j);
    }

    aScheduleInOrder.push(data);
}

function getScheduleByOrder(scheduleArray,order){

    for (var k = 0; k < scheduleArray.length; k++) {
        if (scheduleArray[k].order === order){
            return scheduleArray[k];            
        }
    }   
}
1
Ivo Sturm 12 Фев 2020 в 13:37

Почему бы не использовать метод .sort() Array? РЕДАКТИРОВАТЬ: Aaaah this is part of a school assignment and we have to use the two for loops. школьные задания FTW

let jData = [{
    "currency": "DKK",
    "price": 3000,
    "schedule": [{
        "airlineIcon": "SK.png",
        "date": 1581501600,
        "id": "SAS1",
        "from": "A",
        "to": "B",
        "waitingTime": 0,
        "flightTime": 80,
        "order": 0
      },
      {
        "airlineIcon": "KL.png",
        "date": 1581510000,
        "id": "SAS33",
        "from": "B",
        "to": "C",
        "waitingTime": 60,
        "flightTime": 180,
        "order": 1
      },
      {
        "airlineIcon": "LH.png",
        "date": 1581513600,
        "id": "SAS22",
        "from": "C",
        "to": "D",
        "waitingTime": 120,
        "flightTime": 240,
        "order": 2
      }
    ]
  },

  {
    "currency": "DKK",
    "price": 5000,
    "schedule": [{
        "airlineIcon": "SK.png",
        "date": 1581501600,
        "id": "SAS1",
        "from": "A",
        "to": "B",
        "waitingTime": 0,
        "flightTime": 80,
        "order": 1
      },
      {
        "airlineIcon": "LH.png",
        "date": 1581513600,
        "id": "SAS22",
        "from": "B",
        "to": "C",
        "waitingTime": 120,
        "flightTime": 240,
        "order": 0
      }
    ]
  },

  {
    "currency": "DKK",
    "price": 15000,
    "schedule": [{
      "airlineIcon": "SK.png",
      "date": 1581501600,
      "id": "SAS1",
      "from": "A",
      "to": "B",
      "waitingTime": 0,
      "flightTime": 80,
      "order": 0
    }]
  }
];

jData = jData.map( obj => {
    obj.schedule.sort( (a,b) => a.order > b.order ? 1 : -1); // sort by the "order" key ascending
    return obj;
})

console.log(jData)
1
Jeremy Thille 12 Фев 2020 в 10:11