如何使用变量引用嵌套对象或数组的路径/位置?
问题描述
我有一个包含嵌套对象和数组的数据结构:
let productDataObj = { prodType1: { keyTermsArr: [], frequencyObj: {}, ratingObj: {} }, prodType2: { keyTermsArr: [], frequencyObj: {}, ratingObj: {} } };
我想通过保存嵌套对象/数组的引用来减少重复代码,于是写了如下代码:
let keyTermsArrRef; let frequencyRef; let ratingRef; for (let i = 0; i < products.length; i++) { if (prodType[i] == 1) { keyTermsArrRef = productDataObj.prodType1.keyTermsArr; frequencyRef = productDataObj.prodType1.frequencyObj; ratingRef = productDataObj.prodType1.ratingObj; } else if (prodType[i] == 2) { keyTermsArrRef = productDataObj.prodType2.keyTermsArr; frequencyRef = productDataObj.prodType2.frequencyObj; ratingRef = productDataObj.prodType2.ratingObj; } // 尝试向这些引用变量添加数据,但原嵌套数组/对象里没有同步更新 }
问题是:数据只存在于我创建的三个引用变量中,没有存储到原嵌套结构里。请问有没有办法用变量引用这些嵌套数组和对象的路径?
解决方案
你的思路本身没问题,问题大概率出在操作引用变量的方式上:如果直接给引用变量重新赋值(比如keyTermsArrRef = ['newTerm']),会切断变量和原数组/对象的引用关联,导致原结构不会更新。正确的做法是修改引用指向的内容,而不是重新赋值变量。
1. 先获取对应的产品类型对象(简化代码)
与其分别保存三个引用,不如先拿到对应prodType的整个对象,再直接操作它的属性,代码更简洁,也不容易出错:
for (let i = 0; i < products.length; i++) { // 根据prodType获取对应的嵌套对象 const currentProd = prodType[i] === 1 ? productDataObj.prodType1 : productDataObj.prodType2; // 直接操作currentProd的属性,会同步更新原productDataObj currentProd.keyTermsArr.push('新关键词'); currentProd.frequencyObj['关键词1'] = (currentProd.frequencyObj['关键词1'] || 0) + 1; currentProd.ratingObj['用户A'] = 4.5; }
2. 如果一定要用单独的引用变量
确保操作的是引用指向的内容,而不是重新赋值变量:
let keyTermsArrRef; let frequencyRef; let ratingRef; for (let i = 0; i < products.length; i++) { if (prodType[i] == 1) { keyTermsArrRef = productDataObj.prodType1.keyTermsArr; frequencyRef = productDataObj.prodType1.frequencyObj; ratingRef = productDataObj.prodType1.ratingObj; } else if (prodType[i] == 2) { keyTermsArrRef = productDataObj.prodType2.keyTermsArr; frequencyRef = productDataObj.prodType2.frequencyObj; ratingRef = productDataObj.prodType2.ratingObj; } // ✅ 正确操作:修改引用指向的数组/对象内容 keyTermsArrRef.push('新关键词'); // 数组用push、splice等方法 frequencyRef['关键词X'] = 3; // 对象直接赋值属性 ratingRef['用户B'] = 5; }
错误操作示例(避免)
如果这样写,会切断引用,原结构不会更新:
// ❌ 错误:重新赋值变量,原数组不会变化 keyTermsArrRef = ['新关键词']; // ❌ 错误:重新赋值对象,原对象不会变化 frequencyRef = { '关键词X': 3 };
内容的提问来源于stack exchange,提问作者MeltingDog
相关产品推荐
相关产品推荐

