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