Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/418.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用Array.splice可从两个数组中删除字符串_Javascript_Arrays_Json - Fatal编程技术网

Javascript 使用Array.splice可从两个数组中删除字符串

Javascript 使用Array.splice可从两个数组中删除字符串,javascript,arrays,json,Javascript,Arrays,Json,这就是我要处理的: 在js文件的顶部,我声明了以下变量: let teensArray = []; let copyteensArray = []; let teensArrayLength = 0; let teensArrayPlayed = 0; $.getJSON("json/teens.json", function(data) { teensArray = data.statements; copyteensArray = dat

这就是我要处理的:

在js文件的顶部,我声明了以下变量:

let teensArray = [];
let copyteensArray = [];
let teensArrayLength = 0;
let teensArrayPlayed = 0;

$.getJSON("json/teens.json", function(data) {
        teensArray = data.statements;
        copyteensArray = data.statements;
        teensArrayLength = data.statements.length;
        $(".teens .total-cards").text(teensArrayLength + " CARDS")
    });
每次模式为“青少年”时,执行以下操作:

if (mode == "teens") {
        let currStatement = copyteensArray[getRandomInt(copyteensArray.length)]
        let index = copyteensArray.indexOf(currStatement)
        copyteensArray.splice(index, 1);
        currentPack = "TEENS PACK";
        currentColor = "#23B574";
        srcImg = "svg/007-party hat.svg"
        playedCardsText = ++teensArrayPlayed + " / " + teensArrayLength;
        console.log(copyteensArray.length);
        console.log(teensArray.length);
        return currStatement;
    }
问题在于:在if语句之后,teensArray的值与copyteensArray的值相同

示例值:

在if语句之前
teensArray[“1”、“2”、“3”、“4”]
复制阵列[“1”、“2”、“3”、“4”]

内部if语句
复制阵列拼接(索引1)

在if语句内部返回后
teensArray[“1”、“3”、“4”]
复制阵列[“1”、“3”、“4”]

仅当用户决定返回到另一屏幕时,此函数才会执行:

function reset() {
    copyteensArray = teensArray;
    teensArrayPlayed = 0;
}

我遗漏了什么吗?

copyteensArray=teensArray使相同的指针指向它们。考虑使用<代码> CopeTeNeStase=…code>将
teensArray
内容的全新实例分配给
copyteensArray
您拥有数组的“浅”副本,即两个数组指向相同的对象。对浅层副本所做的任何更改都将更改原始对象

您可以在Windows中将其可视化为快捷方式。对快捷方式所做的任何更改也会更改原始对象

解决这个问题,制作一份硬拷贝。ES6中有多种方法可以做到这一点

hardCopy = [...OriginalArray];
另一种方法是对对象进行JSON.stringify()处理并将其解析回来

hardCopy = JSON.parse(JSON.stringify(OriginalArray));
对于您的代码,请通过更改这些行来修复此问题

$.getJSON("json/teens.json", function(data) {
        teensArray = [...data.statements];
        copyteensArray = [...data.statements];

我怀疑copyTeensArray和teensArray都指向同一个对象,这是由于代码未包含在snippet@TedBrownlow我添加了一个片段,请检查它,但我怀疑它是否是?“
splice()
方法通过删除或替换现有元素和/或在适当位置添加新元素来更改数组的内容”要复制
teensArray
请在
copyteensArray=teensArray之前使用
teensArray.slice()
仅指向
copyteensArray
teensArray
。您需要切片或展开:
copyteensArray=teensArray.slice()
copyteensArray=[…teensArray]
返回一个新数组。但是请记住,虽然这将复制基本元素,但它将返回对任何嵌套对象的引用。你的解决方案似乎不起作用。