web-dev-qa-db-ja.com

JavaScriptで複数の値を返す

多くの場合、座標のペアなど、複数の値を返す関数を作成しています。

function get_coords() {
  return ???;
}

Pythonなどの言語を使用している場合は、タプルを使用します。

return (x, y)

または、JavaのようなOOP言語では、カスタム座標クラスを作成します。

class Coordinates {
  public int x;
  public int y;

  public Coordinates(x, y) {
    this.x = x;
    this.y = y;
  }
}

次に、次のように戻ります。

return new Coordinates(x, y);

JavaScriptへ

JavaScriptでは、単純なオブジェクトを返すオプションがあります。

return {x: x, y: y}

またはカスタムオブジェクトを使用したJavaのようなアプローチ:

return new coordinates(x, y)

上下に使用する理由はありますか?

3
JJJollyjim

これを行うことは、現時点で最良の(そして詳細な)オプションです。

return {'x': x, 'y': y}

呼び出し元は、値を使用するためにこれを行う必要があります

var c = get_coords();
alert(c.x + ' ' + c.y);    // c.x and c.y holds the coordinates

単一軸のみを使用する場合は、次のようにすることができます-

alert(get_coords().x);

ECMAScript 6を使用すると、(呼び出し側で)構造化を行うことができます。

var { x, y} = get_coords();

ECMAScript 6を本番環境で安全に使用するために(ブラウザー間で)かなり待たなければならないのは残念です。

解体に関する詳細- http://fitzgeraldnick.com/weblog/50/

6
Sayem Shafayet

これは、呼び出し元のコードが返された座標で何を行うことが期待されるかに完全に依存します。現在のコードがxおよびyプロパティに直接アクセスする必要があるだけの場合は、リテラルを使用します。

return {x: x, y: y};

戻り値を「アップグレード」する必要があると判断した場合、これを次のように変更するのはかなり簡単です。

return new Coordinates(x, y);

またはこれ:

return BuildCoordinate(x, y);

レガシーコードが.xおよび.yCoordinatesコンストラクターが提供する限り。

そして、次のように、呼び出しコードを特別にCoordinatesメソッドを呼び出すように「アップグレード」することができます。

GetCoords().calculateDistanceTo(anotherX, anotherY);

または、次のように型チェックを実行します。

var coords = GetCoords();
if (coords instanceof Coordinates) {
  coords.plot(canvas);
}

ただし、繰り返しになりますが、「型付けされた」戻り値(作成されたオブジェクト)に付属する手荷物が必要になるまで、最低限の戻り値(オブジェクトリテラル)を使用することをお勧めします。

3
svidgen

両方ともオブジェクトですが同じプロパティで、プロトタイプが異なるだけなので、両方のアプローチは同じです。

簡単にするために、おそらく最初のオプションを選択する必要があります。または、[x, y]という形式の配列を使用して、さらに単純にします。

1
Rok Kralj

データの意味に一致するものを使用してください。

私の圧倒的な習慣は、辞書/ハッシュのような単純なオブジェクトリテラルを使用し、OOPの方法でカスタムプロトタイプオブジェクトを使用することです。

呼び出し元の関数によって直ちに逆アセンブルされる便利な値の単純なコレクションを返していますか?次に、クイックオブジェクトリテラルを使用します。

あなたの戻り値はことそれがが行うrepresentsデータモデルの重要な概念的なもの?次に、時間をかけてコンストラクタを記述し、プロトタイプ化されたインスタンスにします。

確かに、JavaScriptを使用すると、これらのアイデアをブレンドすることで、柔軟(ずさん)かつ賢く(暗号的に)できますが、このルールを守ると、コードがはるかに明確になります。

0
Chris