我有一个简单的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会发生变化,因为我不会在函数中更改它。为什么会发生此错误。请帮帮我。
2 回答
隔江千里
TA贡献1906条经验 获得超10个赞
发生这种情况的原因是数组和对象都是非基元数据类型。您可以在此处阅读更多相关信息 - 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
侃侃尔雅
TA贡献1801条经验 获得超15个赞
您应该从以下位置更改第 50 行:
else testArray.push(allorderDemo[i].orders[j]);
自:
else testArray.push({name: allorderDemo[i].orders[j].name, num:allorderDemo[i].orders[j].num});
原因是因为你的代码正在推送到testArray,只有对allorderDemo中已经存在的同一对象的引用。我编写的这段新代码将创建一个具有相同数据的新对象,并将其推送到 testArray 中。
添加回答
举报
0/150
提交
取消