为了账号安全,请及时绑定邮箱和手机立即绑定

如何克服Js中的阵列突变

如何克服Js中的阵列突变

素胚勾勒不出你 2022-08-18 09:55:34
尝试克服 js 函数中列表的突变。我花了几个小时试图使用诸如复制要使用的数组之类的技术。以及其他方法。我已将我的函数归结为此处显示的更基本的版本:list.slice()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;}它意味着采用多维数组输入并更改最后一个元素的第二个元素。(上面显示的变量中的 6。任何克服这个问题的方法都会很棒。我不是一个程序员,只是需要一个非常简单的工具,并对为什么它不起作用感到失望。谢谢!list
查看完整描述

4 回答

?
开心每一天1111

TA贡献1836条经验 获得超13个赞

JS 数组是一个引用,因此创建非引用副本的最简单方法是将其转换为字符串,然后再转换回数组。添加以下代码行作为函数中的第一行:

function listadjust(b) {
    b=JSON.parse(JSON.stringify(b));
...


查看完整回答
反对 回复 2022-08-18
?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

与基元类型(即数字或字符串)不同,数组是引用类型。这意味着当您将数组分配给变量时,您分配的是内存地址而不是实际数组本身,因此您只需要在对数组进行任何修改之前进行深度克隆即可


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;

}


查看完整回答
反对 回复 2022-08-18
?
慕后森

TA贡献1802条经验 获得超5个赞

这是一个基本解决方案。


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 ] ]

我更改添加了一些示例,以表明无论数组的长度如何,它都可以工作。我还更改了函数以接受选项第二个参数,即您要将其更改为的内容。如果您不希望“change = 1”在那里删除它,但是如果您确实将函数中的“change”更改为您想要将其更改为的任何内容,则可以将其删除。当然,您可能希望替换“change = 1”中的1,无论您希望默认值实际是什么。


编辑:我也不确定为什么人们会想出奇怪的复杂方法来“克隆”数组。您只需要使用ES6方法,即使用点差运算符。看看我如何'让newList = [...list];' 在代码中?这基本上创建了一个与原始数组具有相同值的新数组,但无需简单地更改对它的“引用”。


查看完整回答
反对 回复 2022-08-18
?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

如果你的期望只是改变最后一项的第二个元素,就像这样:

[[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。


查看完整回答
反对 回复 2022-08-18
  • 4 回答
  • 0 关注
  • 73 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信