Javascript 我的数组数据被我的自定义(集合论)Complements()函数损坏了?

Javascript 我的数组数据被我的自定义(集合论)Complements()函数损坏了?,javascript,arrays,prototype,this,set-theory,Javascript,Arrays,Prototype,This,Set Theory,我受够了有限的javascript数组函数,想编写一些我自己的方便原型函数来执行集合论函数 下面是我目前为止的代码 Array.prototype.contains=函数(obj){ var i=该长度; 而(我--){ 如果(此[i]==obj){ 返回true; } } 返回false; } Array.prototype.getIndexes=函数(obj){ var索引=新数组(); var i=该长度; 而(我--){ 如果(此[i]==obj){ 指数.推动(i); } } 回报

我受够了有限的javascript数组函数,想编写一些我自己的方便原型函数来执行集合论函数

下面是我目前为止的代码


Array.prototype.contains=函数(obj){
var i=该长度;
而(我--){
如果(此[i]==obj){
返回true;
}
}
返回false;
}
Array.prototype.getIndexes=函数(obj){
var索引=新数组();
var i=该长度;
而(我--){
如果(此[i]==obj){
指数.推动(i);
}
}
回报指数;
}
Array.prototype.Union=函数(arr){
//将两个数组组合在一起以返回包含所有元素的单个数组(一次)
//{1,2,3,4,5}并({3,4,5,6,7})
//返回:{1,2,3,4,5,6,7}
var primArray=此;
var secondArray=arr;
var i=主阵列长度;
而(我--){
if(secondArray.contains(primArray[i])){
一次拼接(i,1);
}
}
var returnArr=primArray.concat(secondArray);
返回arr;
}
Array.prototype.Intersection=函数(arr){
//返回两个集合中都存在的元素数组
//{1,2,3,4,5}.交({3,4,5,6,7})
//返回:{3,4,5}
var primArray=此;
var secondArray=arr;
var returnArr=新数组;
var i=0;
而++
然后我使用primArray和secondArray创建了一个副本来处理…但问题仍然存在


仅将其分配给变量并不能使其成为新数组,您仍在处理传入的数组。您必须通过循环并复制每个索引或通过连接和拆分手动创建数组的新副本。

有时javascript会让我感到困惑。如果我有字符串变量var str=“hello world”然后我做这个var str2=str,我有两个变量str和str2……如果我以任何方式改变str2,str都不会受到影响,那么为什么当我有一个数组时,这个变量是var newArr=这为什么newArr不会变成一个新的arr,当我用say.splice(0,1)编辑newArr时删除第一个元素。为什么从newArr中删除第一个元素,有时javascript会让我困惑…我想我可以使用var primArray=this.join([])将它连接到一个空数组…丑陋,但我会给它一个goHi,好的,我现在只使用var primArray=this.concat([])这就解决了我的问题。谢谢你的帮助。我很想知道为什么javascript不允许我使用var newArr=this简单地创建一个重复数组;看看这篇文章是否澄清了任何问题:
<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>