当我使用几个 for () 函数循环访问数组时,为什么原始数组会发生变化

我有一个简单的javascript代码。但它没有像我预期的那样工作。我想从javascript对象中提取数据,但是每当我执行该函数时,即使我对原始数组未执行任何操作,原始对象数组也会更改。是对象数组结构的问题吗?还是异步问题?


<!DOCTYPE html>

<html>

<head>

    <title></title>

</head>

<body>

    <button onclick="test()"> </button>

</body>


<script type="text/javascript">

  var testArray = [];

var num1 = 0;

    var allorderDemo = [

    {

        name:'test1',

        orders: [

        {name: 'fanta', num:1},

        {name: 'cola', num:2},

        {name: 'sweet', num:1}

        ]

    },

    {

        name:'test2',

        orders: [

        {name: 'fanta', num:1},

        {name: 'cola', num:2},

        {name: 'sweet', num:1}

        ]

    },

    {

        name:'test3',

        orders: [

        {name: 'fanta', num:1},

        {name: 'cola', num:2},

        {name: 'ox', num:1}

        ]

    }

    ];

     function test(){

        testArray = [];

        for(var i = 0; i < allorderDemo.length; i++){

            for(var j = 0; j < allorderDemo[i].orders.length; j++){

                var index = testArray.findIndex(function(element) {

                        return (element.name == allorderDemo[i].orders[j].name);

                });

                console.log("index",index);

                if(index > 0) testArray[index].num += allorderDemo[i].orders[j].num;

                else testArray.push(allorderDemo[i].orders[j]);

            }

        }

        console.log(allorderDemo.length);

      console.log(testArray);

      console.log(allorderDemo);

    }

</script>

</html>     

我想从allorderdemo中提取testarray。但是每当我执行测试函数时.log控制台.log说原始数组allorderdemo会发生变化,因为我不会在函数中更改它。为什么会发生此错误。请帮帮我。


慕丝7291255
浏览 157回答 2
2回答

隔江千里

发生这种情况的原因是数组和对象都是非基元数据类型。您可以在此处阅读更多相关信息 -&nbsp;https://medium.com/javascript-in-plain-english/javascript-reviewing-primitive-and-non-primitive-data-types-5bc4ca68c3de在这种情况下,您必须执行以下操作:取代testArray.push(allorderDemo[i].orders[j]);'跟testArray.push({...allorderDemo[i].orders[j]});这样,它将创建一个新的JSON对象并将其推送到testArray。有关跨页(...) 语法的更多详细信息(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax)此外,还应将索引更改为,因为索引从 0 开始。index > -1

侃侃尔雅

您应该从以下位置更改第 50 行:else&nbsp;testArray.push(allorderDemo[i].orders[j]);自:else&nbsp;testArray.push({name:&nbsp;allorderDemo[i].orders[j].name,&nbsp;num:allorderDemo[i].orders[j].num});原因是因为你的代码正在推送到testArray,只有对allorderDemo中已经存在的同一对象的引用。我编写的这段新代码将创建一个具有相同数据的新对象,并将其推送到 testArray 中。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript