2016-03-03 3 views
4

Рассмотрим следующий код (React JS код):Массив реверс не работает для меня ...

poll() { 
    var self = this; 
    var url = "//" + location.hostname + "/api/v1/eve/history/historical-data/" + this.state.itemId + '/' + this.state.regionId + '/40'; 

    $.get(url, function(result) { 
     console.log(result.data, result.data.reverse()); 
     self.setState({ 
     error:   null, 
     historicalData: result.data.reverse(), 
     isLoading: false 
     }); 
    }).fail(function(response) { 
     self.setState({ 
     error: 'Could not fetch average price data. Looks like something went wrong.', 
     }); 
    }); 
    } 

Обратите внимание на console.log. Позволяет увидеть изображение:

enter image description here

Последнее, что я проверил, обратный должен изменили порядок массива. Но это не так.

Am I Using this wrong (official MDN Docs)? Почему нет обратной работы?

+3

Из документов MDN: «Метод reverse() меняет массив в месте _». (не мой) – JLRishe

+0

Я пробовал это мышление, которое я мог бы сделать: 'result.data.reverse()', а затем просто 'console.log()' 'result.data'. Увы, это не отменено – TheWebs

+0

Нет, это _is_ отменено. Консоль любого браузера показывает объекты в их текущем состоянии, поэтому 'result.data.reverse(); console.log (result.data); 'даст вам точно такой же результат, как' console.log (result.data); result.data.reverse(); ' – JLRishe

ответ

0

Как описано в https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reverse, reverse() изменяет порядок массива вместо, поэтому массив восстанавливается после того, как он был назван. Вы вызываете его дважды, в результате чего массив восстанавливается в исходном порядке. Попробуйте следующее:

poll() { 
    var self = this; 
    var url = "//" + location.hostname + "/api/v1/eve/history/historical-data/" + this.state.itemId + '/' + this.state.regionId + '/40'; 

    $.get(url, function(result) { 
     result.data.reverse(); 
     console.log(result.data, result); 
     self.setState({ 
      error:   null, 
      historicalData: result, 
      isLoading: false 
     }); 
    }).fail(function(response) { 
     self.setState({ 
      error: 'Could not fetch average price data. Looks like something went wrong.', 
    }); 
} 
+0

Нет, вы не понимаете. Я звоню один раз. Да, два раза. Но посмотрите на консольный журнал. Журнал консоли - это первый раз. даже если я удалю console.log, массив НЕ обратный. – TheWebs

+0

Вы поняли ответ Мэтта Харрисона? Консоль регистрирует массив в обратном порядке дважды, потому что он оценивает обратный вызов() перед протоколированием. – AmericanUmlaut

6

Он изменил его, reverse() выполнен до console.log(). Он сначала мутирует фактический массив, возвращая ссылку, а затем, когда он регистрируется, a также отменяется.

var a = [1,2,3,4]; 
console.log(a, a.reverse()); 
// [4, 3, 2, 1] [4, 3, 2, 1] 

Все, что находится внутри поляков console.log, оценивается первым. Попробуйте 2 обращения вспять, вы можете догадаться, что происходит, оно возвращается к первоначальному порядку, как в вашем примере.

var a = [1,2,3,4] 
console.log(a, a.reverse(), a.reverse()); 
// [1, 2, 3, 4] [1, 2, 3, 4] [1, 2, 3, 4] 
+0

Итак, я сделал: 'var reverseedData = result.data.reverse(); console.log (reverseedata); 'Все еще массив не обратный. он показывает то же самое, что и раньше. Кто-то предложил его, потому что я вызываю reverse else где, но тем не менее этот фрагмент кода не отменяет массив. Я не уверен, почему. – TheWebs

+0

В вашем примере вы дважды вызываете 'result.data.reverse()'. Таким образом, он возвращается к первоначальному порядку. –

+0

@KyleAdams Ваш скриншот «уже» показывает массив в обратном порядке. Удалите все вызовы 'result.data.reverse()' и запишите 'result.data' в консоль, и я думаю, вы увидите его в первоначальном порядке. – JLRishe

1

Источник вашей проблемы заключается в том, что вы не понимаете, как работает консоль вашего браузера.

У многих браузеров есть консоли, которые отображают объекты в состоянии, в котором они находятся, когда вы расширяете их в консоли или когда вы открываете консоль, даже если они меняются после вызова console.log(). Так что если вы делаете:

console.log(result.data); 
result.data.reverse(); 
console.log(result.data); 

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

Чтобы продемонстрировать это поведение консоли, вы можете сделать следующее:

var b = { a: [1, 2, 3] }; 
console.log(b); 
b.a[1] = 9; 
console.log(b); 

, что вы увидите, что b.a в обеих консольных выходах [1, 9, 3].

 Смежные вопросы

  • Нет связанных вопросов^_^