Сортировать массив дат / консольная ошибка? - PullRequest
0 голосов
/ 11 сентября 2018

Я запутался, почему консоль показывает мне отсортированный массив в обоих журналах. Потому что в первый момент, когда я регистрируюсь, это не должно быть отсортировано?

  static reloadAndSortItems() {
    let array = [];
    const items = Store.getStoredItems();

    items.forEach(function (item) {

      // getting the stored date --> back to date object

      let episodeDate = Date.parse(item.episode);
      let parsedEpisode = new Date(episodeDate);


      array.push(parsedEpisode);



    });

    **// should not sorted at this point
    console.log('not sorted', array);**



    let tested = array.sort(function (a, b) {
      return a - b
    });
    **// should be sorted array at this point
    console.log('sorted', tested);**





  }

это входящий массив (который вышел из строя):

["2018-09-13T00:30:00.000Z","2018-09-14T05:25:00.000Z","2018-09-13T00:30:00.000Z","2018-09-11T01:30:00.000Z","2018-09-11T01:30:00.000Z"]

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

Это потому, что метод sort() изменяет исходный массив, а также возвращает новый, поэтому в итоге вы получите два массива с одинаковым порядком элементов:

let arr = [1, 6, 2, 9, 3, 7];
let result = arr.sort((a, b) => a - b);

console.log('Original:', arr);
console.log('Final:', result);

Чтобы избежать такого поведения, вы можете создать дополнительный массив (например, используя метод map(), он возвращает новый массив и не изменяет исходный), и используйте его в качестве исходного массива:

let arr = [1, 6, 2, 9, 3, 7];
let duplicate = arr.map(d => d);
arr.sort((a, b) => a - b);

console.log('Sorted:', arr);
console.log('Duplicate of the initial array:', duplicate);
0 голосов
/ 11 сентября 2018

Метод sort() мутирует массив, для которого он вызывается , поэтому правильная вещь здесь заключается в том, чтобы регистрировать в консоли переменную array, а не переменную tested:

static reloadAndSortItems() {
    let array = [];
    const items = Store.getStoredItems();

    items.forEach(function (item) {

      // getting the stored date --> back to date object

      let episodeDate = Date.parse(item.episode);
      let parsedEpisode = new Date(episodeDate);    

      array.push(parsedEpisode);    
    });

    array.sort(function (a, b) {
      return a - b
    });

    console.log('sorted', array);    
  }

В качестве альтернативы, вы можете клонировать переменную array с помощью .map(), а затем вызвать метод .sort() для этого клонированного массива, например, так:

static reloadAndSortItems() {
    let array = [];
    const items = Store.getStoredItems();

    items.forEach(function (item) {

      // getting the stored date --> back to date object

      let episodeDate = Date.parse(item.episode);
      let parsedEpisode = new Date(episodeDate);    

      array.push(parsedEpisode);    
    });

    // Copy/clone the array using map into tested variable
    const tested = array.map(function(item) { return item; });

    // Sort the tested array. Calling sort on tested will leave array unaffected
    tested.sort(function (a, b) {
      return a - b
    });

    console.log('sorted', tested);  // Sorted
    console.log('array', array);    // Unsorted
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...