Jquery/Javascript удаляет запись из массива с наибольшим значением свойства

У меня есть хорошая загадка, которую я хотел бы решить. Там может быть лучший способ сделать это, и я открыт для идеи. Я пытаюсь написать функцию отмены приложения для рисования на холсте. У меня есть следующий объект, внутри него массив с собственными объектами с тремя свойствами.

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', а затем удалить ее из массива. Каков наилучший способ сделать это?

Привет,

Роберт

6 ответов

Решение

allDamages.scratch.length -1 возвращает последний индекс для этого массива.

Редактировать:

allDamages.scratch.slice(-1).pop() возвращает последний элемент массива.

И если вы просто хотите удалить последний элемент в вашем массиве, вы должны (как сказал Гиви) использовать pop() метод в отсортированном массиве примерно так:

allDamages['scratch'].pop()

Edit2:

Потому что вопрос был неясен для меня. Это мой последний шанс на проблему.

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

Во-первых, хранить счетчик для самых высоких 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;
  }
};

Я думаю, что вы должны создать объект, который сохранит три ваших свойства. После этого вы создаете стек для отмены. Как это:

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 из вашего массива повреждений.

Я упростил мой массив до:

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

Таким образом, я могу использовать функцию.pop() обычным способом.

Спасибо всем за быстрый ответ!!!

Пытаться:

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

ДЕМО здесь.

Другие вопросы по тегам