0

私は限られたjavascript配列関数にうんざりしていて、集合論関数を実行するための独自の便利なプロトタイプ関数をいくつか書きたいと思っていました。

以下は私がこれまでに持っているコードです

<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を使用して、作業用の複製を作成しました...しかし、問題はまだ発生しています

どうもありがとう

4

1 に答える 1

1

それで、primArrayとsecondArrayを使用して複製を作成し、作業しました...しかし、問題はまだ発生しています

変数に代入するだけでは、新しい配列にはなりません。渡された配列で作業を続けています。配列をループして各インデックスをコピーするか、結合して配列の新しいコピーを手動で作成する必要があります。分裂。

于 2010-12-13T15:59:56.620 に答える