1

私には解決したい素敵ななぞなぞがあります。これを行うためのより良い方法があるかもしれません。私はアイデアを受け入れています。キャンバス描画アプリの元に戻す機能を作成しようとしています。次のオブジェクトがあり、その中に 3 つのプロパティを持つ独自のオブジェクトを持つ配列があります。

var allDamages= {};
allDamages['scratch'] = [];
allDamages['scratch'].push({"x":4,"y":6,"index":1});
allDamages['scratch'].push({"x":3,"y":3,"index":2});
allDamages['scratch'].push({"x":9,"y":9,"index":3});
allDamages['scratch'].push({"x":19,"y":39,"index":4});
allDamages['dent'] = [];
allDamages['dent'].push({"x":59,"y":69,"index":5});
allDamages['dent'].push({"x":59,"y":69,"index":9});
allDamages['dent'].push({"x":39,"y":19,"index":6});
allDamages['rip'] = [];
allDamages['rip'].push({"x":20,"y":22,"index":7});
allDamages['rip'].push({"x":100,"y":56,"index":8});

この配列から最後のエントリを削除したい。プロパティ「インデックス」でこれを行いたいです。したがって、プロパティ「インデックス」の値が最も高いエントリを見つけて、それを配列から削除する必要があります。これを行う最善の方法は何ですか?

ご挨拶、

ロバート

4

6 に答える 6

0

まず、オブジェクトで見つかった最高のプロパティのカウンターと、配列index内のそのオブジェクトのインデックスを格納します。scratch

var highestIndex = -Infinity;
var indexInArray

次に、jQuery を使用している場合:

$.each( allDamages.scratch, function highestIndex( index, object ){
  if( object.index > highestIndex ){
    highestIndex = object.index;
    indexInArray = index;
  }
} );

または、そうでない場合:

for( var indexCounter = 0, indexCounter < allDamages.scratch, indexCounter++ ){
  if( allDamanges.scratch[ indexCounter ].index > highestIndex ){
    highestIndex = allDamages.scratch[ indexCounter ].index;
    indexInArray = indexCounter;
  }
};
于 2013-12-03T12:12:43.727 に答える
0

allDamages.scratch.length -1その配列の最後のインデックスを返します。

編集:

allDamages.scratch.slice(-1).pop()配列の最後の項目を返します。

そして、配列の最後の項目を削除したいだけの場合は、(Givi が言ったように)次のpop()ように並べ替えられた配列でメソッドを 使用する必要があります。

allDamages['scratch'].pop()

編集2:

質問がわかりにくかったので。これは、問題に対する私の最後のショットです。

var allDamagesInOneArray = [];

for(array in allDamages){
    allDamagesInOneArray.concat(array);//Assuming every key is an array
}

allDamagesInOneArray.sort(function(a,b){
    return a.index - b.index;
});

var lastObj = allDamagesInOneArray.slice(-1).pop(); //element with latest index
于 2013-12-03T11:51:44.953 に答える
0

配列を次のように単純化しました。

allDamages.push({"x":39,"y":19,"index":6,"type":'dent'});

そうすれば、通常の方法で .pop() 関数を使用できます。

皆様、素早い対応ありがとうございました!!!

于 2013-12-04T12:54:37.920 に答える
0

3 つのプロパティを保存するオブジェクトを作成する必要があると思います。その後、元に戻すためのスタックを作成します。このような:

function yourObject(x,y,index){
   this.x = x; this.y = y; this.index = index;    
}

var yourStack = new Array();

yourStack.push(new yourObject(4, 6, 1));
于 2013-12-03T11:58:39.953 に答える
0

配列の最大インデックスが常に配列の最後の要素である場合:

allDamages.scratch = allDamages.scratch.slice(0, allDamages.scratch.length - 1);

これにより、配列の最後の要素が削除されます

インデックスが増加していない場合、または常に最新のインデックスを削除したい場合は、(私が推測するように) どの損害配列にあるかに関係なく、この関数を使用できます。

var undo = function(input){

    var max= 0;
    var undoType = "";
    var undoIndex = 0;
    for( var type in input ) {
        // type: string

        var locations = input[type];
        // locations: array

        // find the location of the heighest index property.
        for( var i = 0; i < locations.length; i++ ) {
            if( locations[i]["index"] > max) {
                max = locations[i]["index"] ;
                undoType = type;
                undoIndex = index;
            }
        }
    }

    var output = input[type].splice(undoIndex, 1);
    return output;
}

これにより、ダメージ配列から最大の「インデックス」プロパティを持つ要素が削除されます。

于 2013-12-03T12:02:11.110 に答える