Привет im new для jquery или javascript не уверен, в чем разница.. и im пытается прочитать XML файл и отобразить определенные значения из этого xml в выпадающий список (выберите). Метод ajax im использует чтение xml ok, однако в моем выпадающем списке у меня есть несколько идентичных записей, поэтому мне нужно поместить эти записи в какой-то контейнер и пропустить их, чтобы удалить их. Пока у меня есть
var XML_MAP_PATH = "/resources/XML/MapInformationXML.xml";
var selectedSiteName;
var buildingName;
$(document).ready(function () {
//Clear all drop down lists
$('#cboSiteNames >option').remove();
$('#cboFloors >option').remove();
//Read XML file and populate cboSiteNames drop down list
$.ajax({
type: "GET",
crossDomain: true,
url: XML_MAP_PATH,
context: document.body,
dataType: "xml",
xhrFields: { withCredentials: true },
success: function (xml) { //If data is available(success) then..
$(xml).find('Map').each(function () { //go to parent node in xml
siteName = $(this).attr("Site"); //add all site names to siteName var
$("#cboSiteNames").append($('<option></option>').attr("value", siteName).text(siteName)); //add values to dropdownlist
});
}
});
});
XML
<?xml version="1.0"?>
<MapInformation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Map Map_Name="New Mills" Site="New Mills" BuldingName="Mill" FloorNumber="0" ImageFilePath="C:\Users\--\SourceControl\Work\XSD\XSD stuff\XSD stuff\Images\NewMills0.png" />
<Map Map_Name="New Mills" Site="New Mills" BuldingName="Mill" FloorNumber="1" ImageFilePath="C:\Users\--\SourceControl\Work\XSD\XSD stuff\XSD stuff\Images\NewMills1.png" />
<Map Map_Name="New Mills" Site="New Mills" BuldingName="Mill" FloorNumber="2" ImageFilePath="C:\Users\--\SourceControl\Work\XSD\XSD stuff\XSD stuff\Images\NewMills2.png" />
<Map Map_Name="New Mills" Site="New Mills" BuldingName="Round Tower" FloorNumber="0" ImageFilePath="C:\Users\--\SourceControl\Work\XSD\XSD stuff\XSD stuff\Images\NewMills0.png" />
<Map Map_Name="New Mills" Site="New Mills" BuldingName="Round Tower" FloorNumber="1" ImageFilePath="C:\Users\--\SourceControl\Work\XSD\XSD stuff\XSD stuff\Images\NewMills1.png" />
<Map Map_Name="New Mills" Site="New Mills" BuldingName="Round Tower" FloorNumber="2" ImageFilePath="C:\Users\--\SourceControl\Work\XSD\XSD stuff\XSD stuff\Images\NewMills2.png" />
<Map Map_Name="Charfield" Site="Charfield" BuldingName="GES" FloorNumber="1" ImageFilePath="C:\Users\--\SourceControl\Work\XSD\XSD stuff\XSD stuff\Images\Charfield1.png" />
<Map Map_Name="Miskin" Site="Miskin" BuldingName="Miskin Building 1" FloorNumber="0" ImageFilePath="C:\Users\--\SourceControl\Work\XSD\XSD stuff\XSD stuff\Images\NewMills2.png" />
<Map Map_Name="Miskin" Site="Miskin" BuldingName="Miskin Building 2" FloorNumber="1" ImageFilePath="C:\Users\--\SourceControl\Work\XSD\XSD stuff\XSD stuff\Images\Charfield1.png" />
</MapInformation>
Если вы хотите избежать дублирования записей, вы должны создать пустой объект и использовать его для отслеживания дубликатов. Прежде чем создать элемент option
проверьте, существует ли свойство его значения для объекта, если он не создает элемент и не добавляет его значение как свойство объекта.
Это гораздо эффективнее, чем создание элементов, а затем цикл и удаление их.
Изменить:
success: function (xml) { //If data is available(success) then..
$(xml).find('Map').each(function () { //go to parent node in xml
siteName = $(this).attr("Site"); //add all site names to siteName var
$("#cboSiteNames").append($('<option></option>').attr("value", siteName).text(siteName)); //add values to dropdownlist
});
}
Для того, чтобы:
success: function (xml) { //If data is available(success) then..
var map = {};
$(xml).find('Map').each(function () { //go to parent node in xml
siteName = $(this).attr("Site"); //add all site names to siteName var
if (!map.hasOwnProperty(siteName)) { // Check if siteName already exists
map.siteName = true; // Set the siteName property on map to avoid duplicates
$("#cboSiteNames").append($('<option></option>').attr("value", siteName).text(siteName)); //add values to dropdownlist
}
});
}
Хорошо, поэтому я немного изменил код Джорджа, который помог в массовом порядке. Вот что я сделал, чтобы сделать эту работу без использования свойств для проверки.
success: function (xml) { //If data is available(success) then..
var map = [];
$(xml).find('Map').each(function () { //go to parent node in xml
siteName = $(this).attr("Site"); //add all site names to siteName var
if ($.inArray(siteName, map) == -1) {
map.push(siteName);
$("#cboSiteNames").append($('<option></option>').attr("value", siteName).text(siteName)); //add values to dropdownlist
}
$.inArray()
тогда как поиск объекта является O(1)
очень быстро, не требует, чтобы вы перебирали все элементы. Почему вы не хотите использовать объект? В объекте вы знаете местоположение, которое нужно искать, в массиве нет необходимости проверять каждый элемент, а затем выполнять дополнительное сравнение строк для каждого элемента, поэтому он гораздо менее эффективен.