2010-12-13 3 views
0

Я был сыт по горло ограниченными функциями массива 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 создать дубликат для работы на ..., но проблема все еще происходит

Большого спасибо

ответ

1

Так я тогда использовал primArray и secondArray создать дубликат для работы. .. но проблема все еще происходит

Просто присваивая ее переменной, она не делает ее новым массивом, вы все еще работаете над массивом, который был передан. Вам нужно вручную создать новую копию массива либо путем его циклирования, либо копирования каждого индекса, либо путем объединения и разделения.

+0

Когда-то javascript смущает меня. Если у меня есть переменная ул уаг строка = «привет мир» , а затем я делаю это вар str2 = ул У меня есть две переменные ул и str2 ... Если я изменить str2 каким-либо образом ул не влияет Итак, когда у меня есть массив и скажите, что var newArr = this Почему newArr не становится новым arr и когда я редактирую newArr, используя say .splice (0,1), чтобы удалить первый элемент. Почему первый элемент удаляется из newArr и это Иногда javascript смущает меня ... Я полагаю, что я могу просто использовать var primArray = this.join ([]), чтобы присоединиться к нему с пустым массивом ... уродливым, но Я дам ему –

+0

Привет, хорошо, теперь я просто использую var primArray = this.concat ([]), и это решило мою проблему. Спасибо за вашу помощь. Я хотел бы знать, почему javascript не позволяет мне просто создавать дублирующий массив, используя var newArr = this; –

+0

Посмотрите, очищается ли эта статья: http://snook.ca/archives/javascript/javascript_pass – epascarello

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

  • Нет связанных вопросов^_^