Подтвердить что ты не робот

Сохранение измененного массива переменной в javascript

У меня есть массив цветов, который я хочу изменить. У меня есть функция переключения, которая в основном окрашивает элементы на основе массива. Если я бросаю обратную переменную, то она меняет направление, но она меняет глобальную переменную вместо локальной переменной.

var inc_colors = ['#000','#333','#888']; //global inc_colors

function toggleLegendColors(reverse){
  var reverse = reverse || false;
  var colors = inc_colors; //local colors
  if(reverse) colors.reverse(); //reverses inc_colors array as well as colors
  ...
}

Как получить обратный глобальный массив без изменения глобального массива?

4b9b3361

Ответ 1

Так как никто не объяснил, почему у вас возникла проблема, я добавлю это в микс.

При назначении переменной или объекту в javascript переменной присваивается ссылка на этот массив/объект. Он не делает копию массива/объекта. Итак, тогда у вас будет две переменные, которые указывают на один и тот же массив/объект, и изменение одного из них повлияет на другое (поскольку оба они указывают на одну и ту же основную часть данных).

Итак, когда у вас было это:

var inc_colors = ['#000','#333','#888']; //global inc_colors
var colors = inc_colors; //local colors

Теперь у вас есть две переменные, которые указывают на один и тот же фрагмент данных. Измените один и тот же результат, показывая через другую переменную, потому что они указывают на одни и те же базовые данные.

Если вы хотите сделать копию, тогда нужно явно сделать копию (javascript не делает это для вас автоматически). Для массива самый простой способ сделать мелкую копию выглядит следующим образом:

var newColors = Array.prototype.slice.call(inc_colors);

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

var inc_colors = ['#000','#333','#888']; //global inc_colors

function toggleLegendColors(reverse){
  var reverse = reverse || false;
  var colors = Array.prototype.slice.call(inc_colors);  //local copy of the colors array
  if(reverse) colors.reverse(); //reverses inc_colors array as well as colors
  ...
}

Ответ 2

Вы можете сделать это, используя теперь оператор распространения es6:

let colors = [ ...inc_colors ].reverse()

Ответ 3

Просто создайте копию массива, используя Array.slice (безопасный способ):

var colors = Array.prototype.slice.call(inc_colors);

Ответ 4

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

var arr_reverse=arr.slice(0).reverse();

Ответ 5

Упрощенное решение:

var inc_colors = ['#000','#333','#888']; //global inc_colors

function toggleLegendColors(reverse) {
  var colors = (inc_colors instanceof Array) ? inc_colors : [];
  colors = (!reverse) ? inc_colors.slice() : inc_colors.slice().reverse();
  // ...
}