JavaScript用for循环生成新数组时所有项都是最后一个值如何解决
问题修复方案
问题根源
你的代码核心问题是对象引用复用:在处理有汇率数据的else分支中,你在j循环外只创建了一次arrInObj对象,后续每次循环都直接修改这个对象的属性。由于JS中对象是引用类型,push到数组里的只是对象的内存地址,并不是独立副本,所以最终数组里的所有对应元素都会指向同一个对象,自然就全是最后一次循环的赋值结果。
你遇到的circular object Object错误也和引用复用、控制台打印引用类型的快照机制有关。
修复代码
只要把else分支里的对象创建逻辑移到j循环内部,每次循环都生成独立的新对象即可:
var res = [{ id: 3, name: "Türk Lirası", code: "TRY", offerCurrencyTypeExchanges: [], label: "Türk Lirası (TRY)" }, { id: 4, name: "USD", code: "USD", offerCurrencyTypeExchanges: [{ exchangeRateId: 33642, localize: "Alış", value: 9.2857, valueSection: 1 }, { exchangeRateId: 33642, localize: "Satış", value: 9.3024, valueSection: 2 }, { exchangeRateId: 33642, localize: "Efektif alış", value: 9.2792, valueSection: 3 }, { exchangeRateId: 33642, localize: "Efektif satış", value: 9.3164, valueSection: 4 } ] }, { id: 5, name: "EUR", code: "EUR", offerCurrencyTypeExchanges: [{ exchangeRateId: 33643, localize: "Alış", value: 10.8108, valueSection: 1 }, { exchangeRateId: 33643, localize: "Satış", value: 10.8303, valueSection: 2 }, { exchangeRateId: 33643, localize: "Efektif alış", value: 10.8033, valueSection: 3 }, { exchangeRateId: 33643, localize: "Efektif satış", value: 10.8465, valueSection: 4 } ] }, { id: 6, name: "TRY", code: "TRY", offerCurrencyTypeExchanges: [], label: "TRY (TRY)" } ] var resultAutoComplete = []; for (var i = 0; i < res.length; i++) { if (res[i].offerCurrencyTypeExchanges.length == 0) { var arrInObj = { code: res[i].code, id: res[i].id, name: res[i].name, label: res[i].name + " (" + res[i].code + ")" } resultAutoComplete.push(arrInObj) } else { // 每次j循环都创建新的独立对象 for (var j = 0; j < res[i].offerCurrencyTypeExchanges.length; j++) { var exchange = res[i].offerCurrencyTypeExchanges[j]; var arrInObj = { code: res[i].code, id: res[i].id, name: res[i].name, label: res[i].code + " - " + exchange.localize + "(" + exchange.value + ")", exchangeRateId: exchange.exchangeRateId, localize: exchange.localize, value: exchange.value, valueSection: exchange.valueSection } resultAutoComplete.push(arrInObj) } } } console.log(resultAutoComplete)
内容的提问来源于stack exchange,提问作者Süleyman TAŞÇI
相关产品推荐
相关产品推荐

