对象的子数组的数组,如何不修改原数组的功能
Array of subarrays of objects, how to not modify original array in function?
在我编写的一个小程序中,我有一个包含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
的副本使arr
和array
不同的数组对象,但留下他们的元素相同的数组。所以代码中的arr[i].splice(j,1);
在修改array[i]
因为它和arr[i]
是同一个数组
相关文章:
- 使用Underscore.js修改json数组中所选元素的更有效方法
- 修改d3.js圆环图以读取json数组
- 迭代和修改Firebase数组会导致未定义
- 将修改后的数组作为参数传递给函数
- JavaScript:如何在迭代过程中修改数组中的值
- JavaScript:不修改实际数组的函数
- 修改后的原始数组值
- 修改隐藏输入中的json数组
- JavaScript-我可以用for循环中修改的属性将新结构推送到数组中吗
- 修改输入中的数组,然后返回输出
- 对JSON格式的对象数组进行迭代,并对其进行修改和扩展,最好使用Undercore.js
- Polymer:当数组中的对象被外部代码修改时,更新dom重复元素
- 如何过滤/修改主干集合本身,而不是获取新数组
- 我如何修改它以使用数组中的所有项目
- 在javascript中,如何将相同的对象两次推送到一个数组中,并进行一些修改而不覆盖数组
- Emscripten:调用修改数组元素的 C 函数
- JavaScript 修改 URL 参数数组
- 为什么数组上的 js 映射会修改原始数组
- JS多维数组修改值
- 通过包含引用的数组修改特定属性