[英]How to overcome array mutation in Js
试图克服 js function 中列表的突变。 几个小时以来,我一直在尝试使用诸如list.slice()
之类的技术来复制要使用的数组。 以及其他方法。 我已将 function 归结为此处显示的更基本版本:
list = [[1,2],[3,4],[5,6]]
function listadjust(b) {
for (i = 0; i < b.length; i++) {
if (i == (b.length-1)) {
b[i][1] = 1;
}
}
return b;
}
它的意思是采用多维数组输入并更改最后一个元素的第二个元素。 (上面显示的变量list
中的 6。任何克服这个问题的方法都会很棒。我不是程序员,只需要一个非常简单的工具,并且对它为什么不起作用感到失望。谢谢!
如果您的期望只是像这样改变最后一项的第二个元素:
[[1,2],[3,4],[5,6]] -> [[1,2],[3,4],[5,1]]
[[4,3],[2,7],[8,4],[4,7]] -> [[4,3],[2,7],[8,4],[4,1]]
[[1,2],[3,4]] -> [[1,2],[3,1]]
然后你可以这样做:
function listadjust(b) {
const newArray = JSON.parse(JSON.stringify(b))
newArray[newArray.length - 1][1] = 1
return newArray;
}
编辑:对不起,调整为不变异:P。
与原始类型(即数字或字符串)不同,arrays 是引用类型。 这意味着当您将数组分配给变量时,您分配的是 memory 地址而不是实际的数组本身,因此您只需在对数组进行任何修改之前进行深度克隆
list = [[1,2],[3,4],[5,6]]
const clone = (items) => items.map(item => Array.isArray(item) ? clone(item) : item);
function listadjust(b) {
const arr = clone(b)
for (i = 0; i < arr.length; i++) {
if (i == (arr.length-1)) {
arr[i][1] = 1;
}
}
return arr;
}
JS 数组是引用,因此创建非引用副本的最简单方法是将其转换为字符串,然后再转换为数组。 在 function 中添加这行代码作为第一行:
function listadjust(b) {
b=JSON.parse(JSON.stringify(b));
...
这是一个基本的解决方案。
let listOne = [[1,2],[3,4],[5,6]];
let listTwo = [[4,7],[4,1],[2,4],[8,4]];
let listThree = [[1,2],[3,4],[5,6],[0,0,3,5],[2,5,7]];
function listAdjust(list, change = 1) {
let newList = [...list];
let last = newList[newList.length - 1];
//Whatever we want to change it to
last[1] = change;
return newList;
}
console.log(listAdjust(listOne));
console.log(listAdjust(listTwo));
console.log(listAdjust(listThree));
// Which outputs to...
[ [ 1, 2 ], [ 3, 4 ], [ 5, 1 ] ]
[ [ 4, 7 ], [ 4, 1 ], [ 2, 4 ], [ 8, 1 ] ]
[ [ 1, 2 ], [ 3, 4 ], [ 5, 6 ], [ 0, 0, 3, 5 ], [ 2, 1, 7 ] ]
我更改添加了一些示例,以表明无论 arrays 的长度如何,它都能正常工作。 我还更改了 function 以接受您希望将其更改为的选项第二个参数。 如果您不希望它存在,您可以删除“change = 1”,但如果您确实将 function 中的“更改”更改为您想要更改的任何内容。 当然,您可能想要替换 'change = 1' 中的 1,无论您希望默认值实际是什么。
编辑:我也不确定为什么人们会想出奇怪而复杂的“克隆”阵列的方法。 你只需要使用 ES6 方法,也就是使用扩展运算符。 看看我是如何 'let newList = [...list];' 在代码中? 这基本上创建了一个与原始数组具有相同值的新数组,但没有简单地更改对它的“引用”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.