Kategorie szkoleń | Egzaminy | Kontakt
  • 1
  • 1
  • 20

Witam.

Czy istnieją jakieś rozwiązania umożliwiające sortowanie obiektów w pliku JSON?

Przykład:

Mam plik JSON zawierający obiekty jak poniżej:

{"thePlace":[
{"id":"101","type":"rozrywka","name":"Kino","distance":"2"},
{"id":"102","type":"służba zdrowia","name":"Szpital","distance":"1"},
{"id":"103","type":"sklep","name":"Supermarket","distance":"3"}
]}

Chciałbym te obiekty posegregować w kolejności rosnącej parametru "distance".

Karol_Pisarek
  • Zapytał
  • @ Karol_Pisarek | 27.01.2017
    • lider
    • 5
    • 1
    • 13

Odpowiedź (1)

  • 0

Udało mi się stworzyć poniższe rozwiązanie, ale być może są lepsze sposoby na sortowanie obiektów w JavaScript.

<!DOCTYPE html>
<html>
<body>
<button onclick="myFunction()">Sotruj</button>
<p id="demo1">Przed: <br></p>
<p id="demo2">Po: <br></p>
<script>
var check = 1;
function myFunction() {
  var myObj, myJSON, testJSON, text, obj, text2 = "";
  // JSON przechowujacy dane w local storage:
  var placesArray = '{"thePlace":[{"id":"101","type":"rozrywka","name":"Kino","distance":"2"},{"id":"102","type":"służba zdrowia","name":"Szpital","distance":"1"},{"id":"103","type":"sklep","name":"Supermarket","distance":"3"}]}';
  var myObj = JSON.parse(placesArray);
  myJSON = JSON.stringify(myObj);
  localStorage.setItem("testJSON", myJSON);
  // Pozyskanie danych z local storage:
  text = localStorage.getItem("testJSON");
  obj = JSON.parse(text);
  // Lista nieposortowana
  for (var i = 0; i < obj.thePlace.length; i++) {
  document.getElementById("demo1").innerHTML += obj.thePlace[i].id + "/" + obj.thePlace[i].type + "/" + obj.thePlace[i].name + "/" + obj.thePlace[i].distance + "<br>";
  }
  // Sortowanie
  do{
      check = 0;
      for (var i = 1; i < obj.thePlace.length; i++) {
          if(parseInt(obj.thePlace[i].distance) < parseInt(obj.thePlace[i-1].distance)){
              check += 1;
                  poprzedniId = obj.thePlace[i].id;
                  nastepnyId = obj.thePlace[i-1].id;
                  poprzedniName = obj.thePlace[i].name;
                  nastepnyName = obj.thePlace[i-1].name;
                  poprzedniType = obj.thePlace[i].type;
                  nastepnyType = obj.thePlace[i-1].type;
                  poprzedniDistance = obj.thePlace[i].distance;
                  nastepnyDistance = obj.thePlace[i-1].distance;
                  obj.thePlace[i].id = nastepnyId;
                  obj.thePlace[i-1].id = poprzedniId;
                  obj.thePlace[i].name = nastepnyName;
                  obj.thePlace[i-1].name = poprzedniName;
                  obj.thePlace[i].type = nastepnyType;
                  obj.thePlace[i-1].type = poprzedniType;
                  obj.thePlace[i].distance = nastepnyDistance;
                  obj.thePlace[i-1].distance = poprzedniDistance;
          } else {
              check += 0;
          }
      }
  } while (check > 0);
  // Lista posortowana
  for (var i = 0; i < obj.thePlace.length; i++) {
  	document.getElementById("demo2").innerHTML += obj.thePlace[i].id + "/" + obj.thePlace[i].type + "/" +
    obj.thePlace[i].name + "/" + obj.thePlace[i].distance + "<br>";
  }
}
</script>
</body>
</html>

 

Efekt jest następujący:

Przed:
101/rozrywka/Kino/2
102/służba zdrowia/Szpital/1
103/sklep/Supermarket/3

Po:
102/służba zdrowia/Szpital/1
101/rozrywka/Kino/2
103/sklep/Supermarket/3

 

 

Karol_Pisarek
  • Odpowiedział
  • @ Karol_Pisarek | 27.01.2017
    • lider
    • 5
    • 1
    • 13