繁体   English   中英

如何克服 Js 中的数组突变

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM