Во-первых, имейте в виду, что браузеры обычно пытаются нормализовать разметку, добавленную к документу: (http://jsfiddle.net/EVjaq/)
$('#container').append('<div><p>Testing</p>'); // no `</div>`
console.log($('#container').html()); // `<div><p>Testing</p></div>`
Таким образом, открытие <div>
в этой строке будет закрыто для вас до того, как будет добавлено следующее <p>
:
$('#accordion').append('<div><p><a href="mailto:'+ contacts[i].email +'">' + contacts[i].displayname + '</a></p>');
Чтобы избежать этого, вы можете хранить весь HTML в переменной, объединяя сегменты вместе, и добавлять его в DOM только после того, как это будет сделано. Или вы можете сохранить <div>
и добавить к нему, что может сделать условия немного проще:
var lastvalue = null,
lastdiv = null;
for (var i = 0; i <= contacts.length - 1; i++) {
if (contacts[i].department != null) {
if (lastvalue != contacts[i].department) {
$('#accordion').append('<h3><a href="#">' + contacts[i].department + '</a></h3>');
// remember `<div>`
lastdiv = $('<div>').appendTo('#accordion');
}
// append to the `<div>` directly rather than `#accordion`
// also, skip the `else` so you don't have to type this twice
lastdiv.append('<p><a href="mailto:' + contacts[i].email + '">' + contacts[i].displayname + '</a></p>');
lastvalue = contacts[i].department;
r++;
}
}