【问题标题】:My array data is being corrupted somehow by my custom (Set Theory) Complements() function?我的自定义(Set Theory)Complements() 函数以某种方式损坏了我的数组数据?
【发布时间】:2026-01-26 07:05:01
【问题描述】:

我厌倦了有限的 javascript Array 函数,想编写一些我自己方便的原型函数来执行集合论函数。

下面是我到目前为止的代码

<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 arrays prototype this set-theory


    【解决方案1】:

    然后我使用 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([]) 将它加入一个空数组......丑陋,但我会给去吧
    • 嗨,好的,我现在只是使用 var primArray = this.concat([]) 这解决了我的问题。谢谢你的帮助。我很想知道为什么 javascript 不允许我简单地使用 var newArr = this; 创建一个重复的数组
    • 看看这篇文章有没有搞清楚:snook.ca/archives/javascript/javascript_pass