4

配列を実行し、その値を「[1,2,3]」のような文字列に収集する関数を作成しようとしています。また、特定のインデックスに従って、場合によっては配列の一部のみを表示する必要もあります。例: 配列 [1,2,0] をインデックス 0 からインデックス 1 に出力すると、'[1,2]' のようになります。何らかの理由で、私の関数はまったく出力を与えません。ここにあります:

function Tower(size, isFull) {
    this.count = 0;
    this.tower = new Array(size);

    this.add = function(disk) {
        this.tower[this.count++] = disk;
    };

    if (isFull) {
        for (var i = 1; i <= size; i++) {
            this.add(i);
        };
    }

    this.canAdd = function(disk) {
        return this.count == 0 || this.tower[this.count - 1] > disk;
    };

    this.getTopDiskValue = function() {
        return (this.count > 0) ? this.tower[this.count - 1] : 0;
    };

    this.popTop = function() {
        return this.tower[--this.count];
    };

    this.isFull = function() {
        return this.count == this.tower.length;
    };

    this.printable = function() {
        var output = "[";
        for (var i = 0; i < this.count; i++) {
            output += "" + this.tower[i] + ',';
        }
        return output.substring(0, output.length() - 1) + (output.length() > 1 ? ']' : "");
    };
}

コードが次のようになるように、 printable() 関数が文字列を返すことを期待しています。

var tower = new Tower(3,true);
alert(tower.printable());

'[1,2,3]' というテキストが表示された警告ボックスが表示されます。このオブジェクトは Java からの翻訳です。Javaでうまくいきましたが、翻訳は完璧ではないと思います。

4

3 に答える 3

2

あなたがすることはあまりにも複雑です。

として宣言された配列があるとしましょう

var array = [1, 2, 3];

目的の文字列を取得します

return '['+array.join(',')+']';

popやadd関数は必要ありません。それらはネイティブでもあります(そして高度に最適化されています):

var last = array.pop()
array.push(newItem);

参照 :

すべてのブラウザがコンソールを提供していることに注意してください。コンソールには、エラーの詳細な説明があります。たとえば、Chromeデベロッパーツールをご覧ください。

于 2012-10-01T16:49:46.817 に答える
1

JavaScript は Java ではありません。メソッドを呼び出して配列や文字列の長さを取得するのではなく、そのプロパティ.length()を取得するだけです。.length番号を呼び出そうとしたときにスローされる例外は、スクリプトをクラッシュさせ、アラートを防ぐものです。これはうまくいきます:

this.printable = function() {
    var output = "[";
    for (var i = 0; i < this.count; i++) {
        output += "" + this.tower[i] + ',';
    }
    return output.substring(0, output.length - 1) + (output.length > 1 ? ']' : "");
};

.join()ただし、ネイティブメソッドを使用して配列の値を連結することはできます。また、Towerオブジェクトのプロトタイプにメソッドを追加する必要があります。

Tower.prototype.printable = function() {
    if (this.count)
        return "[" + this.tower.slice(0, this.count).join(",") + "]";
    else
        return "";
};

ところで: 通常、このメソッドには名前が付けられtoStringています。便宜上だけでなく、Tower オブジェクトが文字列値にキャストされるときにも使用されます。

于 2012-10-01T16:53:10.390 に答える
1

Array.join()メソッドを使用します。

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/join


this.printable = function() {
    var output = new Array();
    for (var i = 0; i < this.count; i++) {
        output.push(this.tower[i]);
    }
    return output.length == 0 
        ? "" 
        : "[" + output.join(",") + ']';
};

または、見た目と同じくらい単純な場合:

this.printable = function() {
    return this.count == 0 
        ? "" 
        : "[" + this.tower.join(",") + ']';
};
于 2012-10-01T16:50:47.487 に答える