繁体   English   中英

如何映射一个对象并将其设置为另一个对象而不覆盖以前的值?

[英]How can I map over an object and set it to another object without overwriting the previous values?

我正在使用一个包含多个地址、ID 等部分的表单。我正在获取这些对象的值并将其映射到我的 API 可以理解的另一个对象。 我遇到的问题是,当我有两个以上的地址或 ID 时,我的函数会用我通过的最后一个地址或 ID 覆盖所有其他地址。

例如,我希望获取这些数据

data = {
  question_11_address: "124 Aspen Rd",
  question_12_city: "South Orange",
  question_13_state: "NJ",
  question_14_zip: "07052",
  question_15_country: "USA",
  question_11_address_copy_0: "123 Main St",
  question_12_city_copy_0: "Jersey City",
  question_13_state_copy_0: "NJ",
  question_14_zip_copy_0: "07302",
  question_15_country_copy_0: "USA",
  question_11_address_copy_1: "110 Marrin St",
  question_12_city_copy_1: "Hoboken",
  question_13_state_copy_1: "NJ",
  question_14_zip_copy_1: "07302",
  question_15_country_copy_1: "USA",
}

转变为...

const finalAddresses = [
  {
    address: "124 Aspen Rd",
    city: "South Orange",
    state: "NJ",
    zip: "07052",
    country: "USA",
  },
  {
    address: "123 Main St",
    city: "Jersey City",
    state: "NJ",
    zip: "07302",
    country: "USA",
  }
  {
    address: "110 Marrin St",
    city: "Hoboken",
    state: "NJ",
    zip: "07302",
    country: "USA",
  },
]; 

相反,我得到的是......

const finalAddresses = [
  {
    address: "124 Aspen Rd",
    city: "South Orange",
    state: "NJ",
    zip: "07052",
    country: "USA",
  },
  {
    address: "110 Marrin St",
    city: "Hoboken",
    state: "NJ",
    zip: "07302",
    country: "USA",
  },
  {
    address: "110 Marrin St",
    city: "Hoboken",
    state: "NJ",
    zip: "07302",
    country: "USA",
  },
]; 

显然我正在用最后一个值覆盖我传递给我的函数的对象,但是我不确定如何修复它。 我尝试了很多方法,包括在再次调用我的函数之前将对象推送到我的数组,但我仍然遇到这个问题。 请查看我的代码以获取完整代码。

您通过引用将同一对象传递给“生成”函数两次:

const addressObject = {};
const addressCounterArray = ... // [0,1];

const addressCopyArray = addressCounterArray.map((index) => {
  return generateCorrectAddressFormat(index, addressObject, sectionAddress);
});

因此,您没有两个对象 - 它是完全相同的对象,两次包含在结果数组中,并且其值对应于您“生成”它的最后一个索引。 您可以通过运行console.log(finalAddresses[1] === finalAddresses[2])来验证这一点。 ===通过引用检查相等性,因此只有当它实际上是同一个对象时才会记录为true ,而不仅仅是具有相同值的两个对象。

相反,您实际上应该每次都使用一个新对象,例如通过执行以下操作:

const addressCopyArray = addressCounterArray.map((index) => {
  return generateCorrectAddressFormat(index, {}, sectionAddress);
});

你的数据结构有点像噩梦。 它将来自不同记录的数据组合成一条记录。 话虽如此,您应该能够通过它们的“_copy_0”关键部分(或缺少它们)来提取各种记录。

此代码查找“question_11_address”+ 一些结尾。 一开始,结尾是空的,但在第一次迭代之后,它添加了“副本”和一个增加的数字。

 data = { question_11_address: "124 Aspen Rd", question_12_city: "South Orange", question_13_state: "NJ", question_14_zip: "07052", question_15_country: "USA", question_11_address_copy_0: "123 Main St", question_12_city_copy_0: "Jersey City", question_13_state_copy_0: "NJ", question_14_zip_copy_0: "07302", question_15_country_copy_0: "USA", question_11_address_copy_1: "110 Marrin St", question_12_city_copy_1: "Hoboken", question_13_state_copy_1: "NJ", question_14_zip_copy_1: "07302", question_15_country_copy_1: "USA", } const output = []; let currentItem = ""; let currentItemNumber = 0; while (data["question_11_address" + currentItem]) { output.push({ address: data["question_11_address" + currentItem], city: data["question_12_city" + currentItem], state: data["question_13_state" + currentItem], zip: data["question_14_zip" + currentItem], country: data["question_15_country" + currentItem] }); currentItem = "_copy_" + currentItemNumber; currentItemNumber++; } console.log(output);

这是一个遍历数据对象值的解决方案,它仅在您的数据输入一致的情况下才有效,几乎可以肯定有更好的解决方案,但这可能会让您走上正轨

 const data = { question_11_address: "124 Aspen Rd", question_12_city: "South Orange", question_13_state: "NJ", question_14_zip: "07052", question_15_country: "USA", question_11_address_copy_0: "123 Main St", question_12_city_copy_0: "Jersey City", question_13_state_copy_0: "NJ", question_14_zip_copy_0: "07302", question_15_country_copy_0: "USA", question_11_address_copy_1: "110 Marrin St", question_12_city_copy_1: "Hoboken", question_13_state_copy_1: "NJ", question_14_zip_copy_1: "07302", question_15_country_copy_1: "USA", }; const questionValues = Object.values(data); let resultArr = []; questionValues.forEach((val, index) => { if (index % 5 === 0) { resultArr.push({ address: questionValues[index], city: questionValues[index + 1], state: questionValues[index + 2], zip: questionValues[index + 3], country: questionValues[index + 4], }); } }); console.log(resultArr);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM