Я был сыт по горло ограниченными функциями массива javascript и хотел написать несколько собственных собственных функций прототипа для выполнения функций Set Theory.Мои данные массива каким-то образом повреждаются моей функцией (Set Theory) Complements()?
Ниже приведен код, у меня есть для этого до сих пор
<script type="text/javascript">
Array.prototype.contains = function(obj) {
var i = this.length;
while (i--) {
if (this[i] === obj) {
return true;
}
}
return false;
}
Array.prototype.getIndices = function(obj){
var indices = new Array();
var i = this.length;
while (i--) {
if(this[i] === obj){
indices.push(i);
}
}
return indices;
}
Array.prototype.Union = function(arr){
//combines two arrays together to return a single array containing all elements (once)
//{1,2,3,4,5}.Union({3,4,5,6,7})
//returns: {1,2,3,4,5,6,7}
var primArray = this;
var secondArray = arr;
var i = primArray.length;
while(i--){
if(secondArray.contains(primArray[i])){
primArray.splice(i, 1);
}
}
var returnArr = primArray.concat(secondArray);
return returnArr;
}
Array.prototype.Intersection = function(arr){
//Returns an array of elements that are present in both sets
//{1,2,3,4,5}.Intersection({3,4,5,6,7})
//returns: {3,4,5}
var primArray = this;
var secondArray = arr;
var returnArr = new Array;
var i = 0;
while(i++<primArray.length){
if(secondArray.contains(primArray[i])){
returnArr.push(primArray[i]);
}
}
return returnArr;
}
Array.prototype.Complement = function(arr){
//Returns an array of elements that are only in the primary (calling) element
//{1,2,3,4,5}.Complement({3,4,5,6,7})
//return: {1,2}
var primArray = this;
var secondArray = arr;
var i = primArray.length;
while(i--){
if(secondArray.contains(primArray[i])){
primArray.splice(i, 1);
}
}
return primArray;
}
Array.prototype.SymmetricDifference = function(arr){
//Returns elements that are exclusive to each set
//{1,2,3,4,5}.SymmetricDifference({3,4,5,6,7})
//return: {1,2,6,7}
var primArray = this;
var secondArray = arr;
var i = primArray.length;
while(i--){
if(secondArray.contains(primArray[i])){
var indices = secondArray.getIndices(primArray[i]);
primArray.splice(i, 1);
var j=indices.length;
while(j--){
secondArray.splice(indices[j], 1);
}
}
}
var returnArr = primArray.concat(arr);
return returnArr;
}
function run(){
var Q = "A";
var D = [1,2,3,4,5,6,7,8,9,10];
var sets = {
"A":[1,2,3],
"B":[3,4,5],
"C":[5,6,7]
}
var R = D;
for(var el in sets){
R = R.Complement(sets[el]);
}
//if I alert D at this point I get 8,9,10 instead of 1,2,3,4,5,6,7,8,9,10 as I would expect? What am I missing here... It causes a problem when I perform D.Complement(R) later on
document.write(R + "<br/>");
R = R.Union(sets[Q]);
document.write(R + "<br/>");
//Here!
R = D.Complement(R);
document.write(R);
}
</script>
</head>
<body onload="run()">
</body>
</html>
Все работает до конечной точки, когда я затем попытаться получить дополнение домена и мой недавно построенный комплекс. Ожидается, что я получу дополнение к [1,2,3,4,5,6,7,8,9,10] и [8,9,10,1,2,3], что даст [4, 5,6,7], но когда я выполняю D.Complement (R), моя переменная D, похоже, превратилась в [1,2,3]. Это происходит после перечисления, которое я выполняю.
Я думал, что это может быть потому, что я использовал this.splice и arr.splice в своих функциях, и когда я передавал переменные функциям, которые они передавали в качестве указателей, что я фактически работал над фактическими ячейками памяти. Так я тогда использовал primArray и secondArray создать дубликат для работы на ..., но проблема все еще происходит
Большого спасибо
Когда-то javascript смущает меня. Если у меня есть переменная ул уаг строка = «привет мир» , а затем я делаю это вар str2 = ул У меня есть две переменные ул и str2 ... Если я изменить str2 каким-либо образом ул не влияет Итак, когда у меня есть массив и скажите, что var newArr = this Почему newArr не становится новым arr и когда я редактирую newArr, используя say .splice (0,1), чтобы удалить первый элемент. Почему первый элемент удаляется из newArr и это Иногда javascript смущает меня ... Я полагаю, что я могу просто использовать var primArray = this.join ([]), чтобы присоединиться к нему с пустым массивом ... уродливым, но Я дам ему –
Привет, хорошо, теперь я просто использую var primArray = this.concat ([]), и это решило мою проблему. Спасибо за вашу помощь. Я хотел бы знать, почему javascript не позволяет мне просто создавать дублирующий массив, используя var newArr = this; –
Посмотрите, очищается ли эта статья: http://snook.ca/archives/javascript/javascript_pass – epascarello