Jquery/Javascript正在从具有最高属性值的数组中删除条目

Jquery/Javascript removing entry from array with highest property value

本文关键字:属性 数组 删除 Javascript 高属性 Jquery      更新时间:2024-03-05

我有一个很好的谜题,我想看到它被解开。也许有更好的方法可以做到这一点,我对这个想法持开放态度。我正在尝试为一个画布绘图应用程序编写一个撤消函数。我有下面的对象,其中有一个数组,它有自己的对象,有三个属性。

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});

我想从这个数组中删除最后一个条目。我想通过属性"index"来完成此操作。因此,我需要以某种方式找到属性"index"值最高的条目,然后将其从数组中删除。做这件事最好的方法是什么?

问候,

Robert

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

我认为应该创建一个保存三个属性的对象。之后,您将创建一个用于撤消的堆栈。像这样:

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));

如果数组中的最高索引总是数组的最后一个元素:

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

这应该会从你的伤害数组中删除具有最大"索引"属性的元素。

首先,存储对象中最高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;
  }
};

尝试:

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});
var index;
var cnt = 0;
var val;
$.each(allDamages,function(k,v){        
    if(cnt == 0){
        index = highest(v);  //get highest value from each object of allDamages    
        val = k;
    }
    else{
        if(highest(v) > index){
            index = highest(v);
            val = k;
        }
    }
    cnt++;    
});
console.log("highest : "+index+": "+val);
var len = allDamages[val].length;
for(var i=0;i<len;i++){    
    if(allDamages[val][i].index == index){
        allDamages[val].splice(i,1); //remove object having highest value
        break;
    }
}
console.log(allDamages);
function highest(ary) {
    var high = ary[0].index;
    var len = ary.length;
    if(len > 0){
        for(var i=0;i<len;i++){
            if(ary[i].index > high){
                high = ary[i].index;
            }
        }
    }
    return high;
}

此处演示

我已经将数组简化为:

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

这样我就可以以正常的方式使用.pop()函数。

感谢大家的快速反应!!!