11

オプションを反転させたい色の配列があります。基本的に配列に基づいて要素に色を付けるトグル機能があります。逆変数をスローすると逆になりますが、ローカル変数ではなくグローバル変数が逆になります。

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
  ...
}

グローバル配列を変更せずに逆のグローバル配列を取得するにはどうすればよいですか?

4

5 に答える 5

14

es6 スプレッド オペレーターを使用してこれを行うこともできます。

let colors = [ ...inc_colors ].reverse()
于 2016-01-25T17:16:17.957 に答える
13

あなたが問題を抱えている理由を誰も本当に説明していないので、私はそれをミックスに追加します.

配列またはJavaScriptのオブジェクトを変数に割り当てると、その配列/オブジェクトへの参照が割り当てられます。配列/オブジェクトのコピーは作成されません。したがって、同じ配列/オブジェクトを指す 2 つの変数があり、いずれかを変更すると、もう一方に影響します (両方とも同じ基になるデータを指しているため)。

だから、あなたがこれを持っていたとき:

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

これで、まったく同じデータを指す 2 つの変数しかありません。どちらか一方を変更すると、もう一方の変数を介して同じ結果が表示されます。それらは同じ基になるデータを指しているからです。

コピーを作成したい場合は、明示的にコピーを作成する必要があります (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
  ...
}
于 2013-01-16T20:26:43.243 に答える
11

Array.slice(安全な方法)を使用してアレイのコピーを作成するだけです。

var colors = Array.prototype.slice.call(inc_colors);
于 2013-01-16T19:48:44.143 に答える
1

単純な解決策:

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();
  // ...
}
于 2013-01-16T20:00:45.733 に答える