Сортировка массива машинописного текста по разным переменным

Я работаю с Ionic Framework и у меня есть массив объектов следующим образом:

[{
    "label_gas": "calle 79",
    "latitud_gas": "4.6653863",
    "longitud_gas": "-74.057738",
    "direccion_gas": "carrera 15 79 - 05",
    "telefono_gas": "0",
    "info_gas": "lunes a viernes de 9am a 4 pm",
    "vlr_dtg": "8.900",
    "desc_param": "Gasolina",
    "distance": "2.887783486866033",
    "price": 8900,
    "timeorigin": 856,
    "distanceorigin": 4012,
    "timetext": "14 min",
    "disttext": "4,0 km"
}, {
    "label_gas": "carulla pepe sierra",
    "latitud_gas": "4.6631135",
    "longitud_gas": "-74.058953",
    "direccion_gas": "carrera 15 114 - 32 piso 2",
    "telefono_gas": "0",
    "info_gas": "lunes a viernes de 9am a 4 pm",
    "vlr_dtg": "8.900",
    "desc_param": "Gasolina",
    "distance": "2.914579482181539",
    "price": 8900,
    "timeorigin": 807,
    "distanceorigin": 3726,
    "timetext": "13 min",
    "disttext": "3,7 km"
}, {
    "label_gas": "metropolis",
    "latitud_gas": "4.6808656",
    "longitud_gas": "-74.082527",
    "direccion_gas": "carrera 68 75a - 50 local 201",
    "telefono_gas": "2259757",
    "info_gas": "lunes a viernes de 9 am a 7 pm sabados de 10 am a 4 pm",
    "vlr_dtg": "8.900",
    "desc_param": "Gasolina",
    "distance": "0.3627612769464051",
    "price": 8900,
    "timeorigin": 201,
    "distanceorigin": 722,
    "timetext": "3 min",
    "disttext": "0,7 km"
}, {
    "label_gas": "polo club  bogota",
    "latitud_gas": "4.66976027",
    "longitud_gas": "-74.063396",
    "direccion_gas": "CARRERA 24 N\u00b0 80 - 56",
    "telefono_gas": "7454692",
    "info_gas": "l - v de 9 am a 5 pm = 17",
    "vlr_dtg": "8.900",
    "desc_param": "Gasolina",
    "distance": "2.102835544304587",
    "price": 8900,
    "timeorigin": 657,
    "distanceorigin": 4430,
    "timetext": "11 min",
    "disttext": "4,4 km"
}, {
    "label_gas": "las ferias  bogota",
    "latitud_gas": "4.68368472",
    "longitud_gas": "-74.091205",
    "direccion_gas": "AVENIDA CALLE 72 N\u00b0 69P - 15",
    "telefono_gas": "3114088",
    "info_gas": "l - v de 9 am a 5 pm = 17",
    "vlr_dtg": "8.900",
    "desc_param": "Gasolina",
    "distance": "1.347357157524655",
    "price": 8900,
    "timeorigin": 421,
    "distanceorigin": 1927,
    "timetext": "7 min",
    "disttext": "1,9 km"
}, {
    "label_gas": "toberin  bogota",
    "latitud_gas": "4.66705583",
    "longitud_gas": "-74.060799",
    "direccion_gas": "AUTOPISTA NORTE #163 A 68",
    "telefono_gas": "7426684",
    "info_gas": "l - v de 9 am a 5 pm = 17",
    "vlr_dtg": "8.900",
    "desc_param": "Gasolina",
    "distance": "2.5013177470053187",
    "price": 8900,
    "timeorigin": 723,
    "distanceorigin": 5189,
    "timetext": "12 min",
    "disttext": "5,2 km"
}, {
    "label_gas": "los alcazares  bogota",
    "latitud_gas": "4.66233277",
    "longitud_gas": "-74.066034",
    "direccion_gas": "CALLE 72 N\u00b0 22 - 42",
    "telefono_gas": "7424219",
    "info_gas": "l - v de 9 am a 5 pm = 17",
    "vlr_dtg": "8.900",
    "desc_param": "Gasolina",
    "distance": "2.3931383808296447",
    "price": 8900,
    "timeorigin": 652,
    "distanceorigin": 3133,
    "timetext": "11 min",
    "disttext": "3,1 km"
}, {
    "label_gas": "morato  bogota",
    "latitud_gas": "4.69900472",
    "longitud_gas": "-74.069650",
    "direccion_gas": "AVENIDA SUBA N\u00b0 115 - 79",
    "telefono_gas": "7431438",
    "info_gas": "l - v de 9 am a 5 pm = 17",
    "vlr_dtg": "8.900",
    "desc_param": "Gasolina",
    "distance": "2.5503614606469958",
    "price": 8900,
    "timeorigin": 654,
    "distanceorigin": 3494,
    "timetext": "11 min",
    "disttext": "3,5 km"
}, {
    "label_gas": "autopista 98  bogota",
    "latitud_gas": "4.68513361",
    "longitud_gas": "-74.056775",
    "direccion_gas": "CALLE 97 N\u00b0 23 - 60",
    "telefono_gas": "6182360",
    "info_gas": "l - v de 9 am a 5 pm = 17",
    "vlr_dtg": "8.900",
    "desc_param": "Gasolina",
    "distance": "2.6922032453221525",
    "price": 8900,
    "timeorigin": 665,
    "distanceorigin": 5019,
    "timetext": "11 min",
    "disttext": "5,0 km"
}, {
    "label_gas": "titan plaza  bogota",
    "latitud_gas": "4.69587583",
    "longitud_gas": "-74.087193",
    "direccion_gas": "CARRERA 72 N\u00b0 80-94 LOCAL 1- 1",
    "telefono_gas": "7451222",
    "info_gas": "l - v de 9 am a 3  pm = 26",
    "vlr_dtg": "8.900",
    "desc_param": "Gasolina",
    "distance": "2.0723238665716806",
    "price": 8900,
    "timeorigin": 731,
    "distanceorigin": 3867,
    "timetext": "12 min",
    "disttext": "3,9 km"
}, {
    "label_gas": "centro de pagos occidente  bogota",
    "latitud_gas": "4.68720861",
    "longitud_gas": "-74.081851",
    "direccion_gas": "AVENIDA CALLE 80 N\u00b0 69 - 40",
    "telefono_gas": "4395276",
    "info_gas": "l - v de 9 am a 7 pm = 10",
    "vlr_dtg": "8.900",
    "desc_param": "Gasolina",
    "distance": "0.9747749482713376",
    "price": 8900,
    "timeorigin": 651,
    "distanceorigin": 2849,
    "timetext": "11 min",
    "disttext": "2,8 km"
}, {
    "label_gas": "santa helenita  bogota",
    "latitud_gas": "4.65963638",
    "longitud_gas": "-74.062313",
    "direccion_gas": "Avenida calle 72 # 81A - 20\/26",
    "telefono_gas": "7431832",
    "info_gas": "l - v de 9 am a 5 pm = 17",
    "vlr_dtg": "8.900",
    "desc_param": "Gasolina",
    "distance": "2.8920438525050627",
    "price": 8900,
    "timeorigin": 647,
    "distanceorigin": 3138,
    "timetext": "11 min",
    "disttext": "3,1 km"
}, {
    "label_gas": "la castellana  bogota",
    "latitud_gas": "4.68335361",
    "longitud_gas": "-74.062572",
    "direccion_gas": "Carrera 49B NO.94-52",
    "telefono_gas": "743",
    "info_gas": "l - v de 9 am a 5 pm = 17",
    "vlr_dtg": "8.900",
    "desc_param": "Gasolina",
    "distance": "2.020259659681773",
    "price": 8900,
    "timeorigin": 703,
    "distanceorigin": 4517,
    "timetext": "12 min",
    "disttext": "4,5 km"
}, {
    "label_gas": "calle 79",
    "latitud_gas": "4.6653863",
    "longitud_gas": "-74.057738",
    "direccion_gas": "carrera 15 79 - 05",
    "telefono_gas": "0",
    "info_gas": "lunes a viernes de 9am a 4 pm",
    "vlr_dtg": "9.000",
    "desc_param": "ACPM",
    "distance": "2.887783486866033",
    "price": 9000,
    "timeorigin": 856,
    "distanceorigin": 4012,
    "timetext": "14 min",
    "disttext": "4,0 km"
}]

У меня есть переменные, объявленные следующим образом:

jsonDataGas: any;
sortJsonDataPrice: any;
sortJsonDataDistance: any;

И в конструкторе мне нужно заполнить каждую переменную (sortJsonDataPrice, sortJsonDataDistance), упорядочив основной массив, который находится в переменной jsonDataGas

constructor(public navCtrl: NavController, public navParams: NavParams, private superTabsCtrl: SuperTabsController) {
    this.jsonDataGas = navParams.get('jsonDataGas');
    console.log(this.jsonDataGas);
    this.sortJsonDataPrice = this.jsonDataGas.sort((a,b) => {
      let nameA=a.label_gas.toLowerCase(), nameB=b.label_gas.toLowerCase()
      return a.price-b.price || nameA < nameB;
    });
    console.log(this.sortJsonDataPrice);
    this.sortJsonDataDistance = this.jsonDataGas.sort((a,b) => {
      return a.distanceorigin-b.distanceorigin;
    });
    console.log(this.sortJsonDataDistance);
    console.log(this.jsonDataGas);
  }

В результате при печати переменных все они остаются в одном и том же порядке, а основная переменная jsonDataGas изменяется.

Я не работал с этой структурой и был бы признателен за любую помощь.

1 ответ

Решение

В JavaScript Array.prototype.sort сортирует на месте. То есть он изменяет массив, на котором работает. Ваш первый звонок this.jsonDataGas.sort виды this.jsonDataGas определенным образом, а затем ваш второй вызов сортирует его по-другому.

Поскольку вам нужны два независимо отсортированных массива, вам нужно сначала скопировать их. Пытаться, this.jsonDataGas.slice().sort(...), где slice дает вам мелкий клон вашего массива. Обратите внимание, что, поскольку клон неглубокий, он не копирует нижележащие объекты. Итак, если вы делаете this.sortJsonDataPrice[0].timetext = 'bla', который также изменит некоторый элемент в this.sortJsonDataDistance (а также this.jsonDataGas).

Другие вопросы по тегам