对象的子数组的数组,如何不修改原数组的功能

Array of subarrays of objects, how to not modify original array in function?

本文关键字:数组 修改 功能 何不 对象      更新时间:2023-09-26

在我编写的一个小程序中,我有一个包含3个子数组的数组,每个子数组包含4个对象。我将数组放入一个函数,该函数从每个子数组中消除值,直到每个子数组中只剩下一个对象,并返回一个包含最后三个剩余对象的对象。

我的问题是,无论我做什么,原始数组都在这个过程中被修改。我尝试了以下操作:

    var itemsArr = [[obj1, obj2, obj3, obj4], [moreObj1, moreObj2, moreObj3, moreObj4],[lastObj1, lastObj2, lastObj3, lastObj4]];
    // each item in itemsArr subjarrays are objects containing name, url, and id keys.
        var generateResults = function(array, num){
        var arr = array.slice();    // generating copy of original array here (for some reason it isn't working 
// have also tried arr = [].concat(array);
        var counter = 1;
        var holderObj;
        var results = {
          baby: null,
          husband: null,
          home: null
        };
        var tempArr;
        // iterate over outer array, containing arrays in each element
        var i = 0;
        while (true){
            if (arr[i].length === 1){
                holderObj = arr.splice(i,1)[0][0];
                i--; // accounting for reindexing of arr. could also iterate backwards if this doesn't work
                results[holderObj.id] = holderObj;
            }
            if (arr[i]){
                for (var j=0; j<arr[i].length; j++){
                    if (counter === num){
                        arr[i].splice(j,1);
                        counter = 0;
                        j--;  // accounts for reindexing of arr[i]. Other solution would be iterating backwards
                    }
                    else{
                        counter ++;
                    }
                }
            }
            if (results.baby !== null && results.husband !== null && results.home !== null){
              break;
            }
            else if (i === arr.length-1){
                i = -1;
            }
            i++;
        }
        return results;
    }

我怎么能防止我的原始itemsArr被修改,当我调用generateResults(itemsArr, num);?

我也试过用Var arr = [].concat(array);

尝试使用Array.prototype.slice()

generateResults(itemsArr.slice(), num)

var itemsArr = [{a:1},{b:2},{c:3},{d:4}];
var itemsArrCopy = itemsArr.slice();
itemsArrCopy.splice(1,1);
console.log(itemsArr, itemsArrCopy);

二级数组复制应避免修改数组的array参数,通过替换

var arr = array.slice();

var arr = [];
// ...
for(var i = 0; i < array.length; ++i)
    arr[i] = array[i].slice();

正如发布的array的副本使arrarray不同的数组对象,但留下他们的元素相同的数组。所以代码中的arr[i].splice(j,1);在修改array[i]因为它和arr[i]是同一个数组