2013-03-12 2 views
1

У меня есть куча записки div s в следующем формате:Получить высокий идентификатор с помощью JavaScript

<div class="note-row" id="1"> 
<div class="note-row" id="2"> 
<div class="note-row" id="4"> 
<div class="note-row" id="5"> 
<div class="note-row" id="6"> 

Как бы я получить с помощью JavaScript крупнейшего id? До сих пор у меня есть:

$('.note-row').each(function() { 
    ?? 
}); 
+4

В соответствии с HTML Spec идентификаторы не могут начинаться с числа. –

+8

За исключением HTML5 и в конечном итоге выше. –

+0

Если элементы упорядочены по идентификатору, и только эти элементы имеют класс 'note-row', вы можете сделать это с помощью' .last'. -> '$ ('. note-row'). last() [0] .id' –

ответ

11

Быстрый и грязный путь:

var max = 0; 
$('.note-row').each(function() { 
    max = Math.max(this.id, max); 
}); 
console.log(max); 

Это немного короче и более сложные (для использования reduce, а также позволяет отрицательные идентификаторы вплоть до Number.NEGATIVE_INFINITY, как это было предложено Blazemonger):

var max = $('.note-row').get().reduce(function(a, b){ 
    return Math.max(a, b.id) 
}, Number.NEGATIVE_INFINITY); 
+0

+1, гораздо более эффективный, чем другой ответ, который использует' map' и 'sort'. – Dogbert

+2

'max = Math.max (this.id, max)' в любое время будет бить оператор if-then. – Blazemonger

+0

@Blazemonger Спасибо. Мне было интересно, нужно ли мне добавлять parseInt тоже, и Math.max тоже позаботится об этом. Обновлено. – bfavaretto

8

Вы могли бы сделать что-то вроде этого:

var ids = $('.note-row').map(function() { 
    return parseInt(this.id, 10); 
}).get(); 

var max = Math.max.apply(Math, ids); 
+0

Почему бы не использовать [этот трюк] (http://stackoverflow.com/q/1418569/901048)? – Blazemonger

+0

За исключением того, что на самом деле это не самое высокое для меня. Самое высокое в наборе, которое у меня есть, равно 20, тогда как это дает мне 9. – David542

+2

Кроме того, что это неэффективно, это не будет работать, поскольку '.sort' в JS не работает с числами, как вы ожидали. – Dogbert

0

То же, как вы бы найти максимальный, цикл:

var max = -999; // some really low sentinel 

$('.note-row').each(function() { 
    var idAsNumber = parseInt(this.id, 10); 
    if (idAsNumber > max) { 
     max = idAsNumber; 
    } 
}); 
+0

'max = Number.NEGATIVE_INFINITY' - начальное значение, которое вы искали. – Blazemonger

0
var maxID = -1; 
    $('.note-row').each(function() { 
     var myid = parseInt($(this).attr('id'),10); 
     if(maxID < myid) maxID = myid; 
    }); 
    // the value of maxID will be the max from id-s 
2

Забавно, но это также работает:

var max = $('.note-row').sort(function(a, b) { return +a.id < +b.id })[0].id; 

http://jsfiddle.net/N5zWe/

+0

В идеале функции сортировки компаратора должны возвращать -1 ot 0 или 1. –

+0

@ Vega Я знаю, но в этом случае это не обязательно, так как мы ищем максимальное значение. Во всяком случае, я предлагал это решение только ради любопытства. Конечно, это отстой. – dfsq

2

В интересах полноты, оптимизированное решение Vanilla JS:

var n = document.getElementsByClassName('note-row'), 
    m = Number.NEGATIVE_INFINITY, 
    i = 0, 
    j = n.length; 
for (;i<j;i++) { 
    m = Math.max(n[i].id,m); 
} 
console.log(m); 
+0

[Это самый быстрый способ] (http://jsperf.com/stack-overflow-question-15371102/2), если не обязательно самый короткий код. – Blazemonger

Смежные вопросы