Как поменять местами два элемента внутри 2D-массива в JavaScript?(Смущен тем, что я вижу из console.log в Chrome) - PullRequest
0 голосов
/ 14 февраля 2019

Я хочу поменять два массива внутри 2D-массива, однако JS, кажется, делает это до того, как произойдет мой фактический обмен.

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

var points = [[1,2],[10,20],[100,200]];
console.log(points);
var a = points[1][0];
var b = points[1][1];
points[1][0] = points[2][0];
points[1][1] = points[2][1];
points[2][0] = a;
points[2][1] = b;
console.log(points);

Я знаю, что этот код не является СУХИМЫМ, но имеет ту же проблему: «точки» записываются на консоль в строке после объявления, хотяв этом журнале он уже поменялся местами?Как это возможно, так как еще не было команд, говорящих об этом.Как JavaScript обрабатывает этот мир кода?И почему мой не работает?

** Ожидаемый вывод для первого журнала: [[1,2], [10,20], [100,200]] ** и длявторой журнал: [[1,2], [100,200], [10,20]]

Отрезанный StackOverFlow запускает его, как и ожидалось, но Chrome запускает его по-другому

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

pswg правильно, это связано с ленивым eval массивов Chrome для таких вещей, как console.log.Вот более подробно: Неужели консоль JavaScript в Chrome ленилась оценивать массивы?

0 голосов
/ 14 февраля 2019

Я думаю, что здесь происходит то, что консоль показывает что-то вроде этого (в Firefox):

initial console

Но затем вы нажимаете, чтобы развернуть егочтобы взглянуть внутрь массива, элементы поменялись местами:

expanded console

Это потому, что консоль фактически показывает вам ссылку в массив, и поскольку ваш алгоритм изменяет исходный массив вместо , к тому времени, когда вы щелкаете, чтобы развернуть элемент в консоли, ссылка была изменена.Ваш код в порядке, вы можете попробовать использовать .toString() или JSON.stringify или даже [...points], чтобы убедиться, что вывод на консоль в каждой строке - это разные значения, а не ссылка на одно и то же значение.

Запустив ваш точный алгоритм с console.log(points.toString()) вместо этого, я вижу это (снова в Firefox):

toString demo

И только для демонстрации, вот как вы можетеупростите ваш код, чтобы сделать то же самое, используя деструктурированное присваивание:

var points = [[1, 2], [10, 20], [100, 200]];
console.log(points.toString());
[points[1], points[2]] = [points[2], points[1]];
console.log(points.toString());
...