简体   繁体   English

Javascript object 正在覆盖自身

[英]Javascript object is overwriting itself

I'm trying to parse some data I extract from a google sheets into a javascript object to create some sitelink extensions within google apps scripts.我正在尝试将从谷歌表格中提取的一些数据解析为 javascript object 以在谷歌应用程序脚本中创建一些附加链接扩展。 My code for parsing the data is:我解析数据的代码是:

function parseData(sheetData)
{
  var parsedData = {};
  var header = sheetData.shift()
  for(lineIndex in sheetData)
  {
    var accountID = sheetData[lineIndex][0]
    var campaignName = sheetData[lineIndex][1]
    var description1 = sheetData[lineIndex][2]
    var description2 = sheetData[lineIndex][3]
    var url = sheetData[lineIndex][4]
    
    if(!(accountID in Object.keys(parsedData)))
    {
      parsedData[accountID] = {}
    }
    if(!(campaignName in Object.keys(parsedData[accountID])))
    {
      var tempObject = {}
      parsedData[accountID][campaignName] = tempObject
      for(columnIndex in sheetData[lineIndex])
      {
        //parsedData[accountID][campaignName][header[columnIndex]] = sheetData[lineIndex][columnIndex]
        tempObject[header[columnIndex]] = sheetData[lineIndex][columnIndex]
      }
      parsedData[accountID][campaignName] = tempObject
    }
  }
  return parsedData
}

I'm doing this so I can retrieve information by accountID and campaignName in the next steps.我这样做是为了在接下来的步骤中按 accountID 和 campaignName 检索信息。

But every time it creates the "campaignName" object it ends upd overwriting itself and only saves the last campaignName object, only one per accountID object.但是每次它创建“campaignName”object 时,它最终都会覆盖自己,并且只保存最后一个campaignName object,每个accountID object 只有一个。

Does anyone knows why this is happening?有谁知道为什么会这样?

Edit: I was expecting to get an object in the following shape:编辑:我期待得到以下形状的 object:

{{111-111-2222=
    {campaignName1=
        {description1=best prices available, 
        url=https://exampleurl.com},
    {campaignName2=
        {description1=Em até 12x sem Juros, 
        url=https://exampleurl.com}
},
{111-111-3333=
    {campaignName1=
        {description1=best prices available, 
        url=https://exampleurl.com},
    {campaignName2=
        {description1=Em até 12x sem Juros, 
        url=https://exampleurl.com}
}}

So, when I execute my code, I can access data by:因此,当我执行代码时,我可以通过以下方式访问数据:

var currentAccountID = AdsApp.currentAccount().getCustomerId();
  var campaignNames = Object.keys(sitelinkData[currentAccountID])
  
  var campaigns = AdsApp.campaigns()
                        .withCondition("CampaignStatus='ENABLED'")
                        .get()
  while(campaigns.hasNext())
  {
    var campaign = campaigns.next()
    var campaignName = campaign.getName()
    var description1 = parsedData[currentAccountID][campaignName]["Description1"]
}
}

Here's something that might work.这是可能有用的东西。 It's tough to test because there's no data.很难测试,因为没有数据。 But the problem you have, I think, is that you're assigning parsedData[accountID][campaignName] = tempObject rather than appending tempObject to the existing parsedData[accountID][campaignName]但是我认为,您遇到的问题是您正在分配parsedData[accountID][campaignName] = tempObject而不是将tempObject附加到现有的parsedData[accountID][campaignName]

function parseData(sheetData)
{
  var parsedData = {};
  var header = sheetData.shift()
  for(lineIndex in sheetData)
  {
    var accountID = sheetData[lineIndex][0]
    var campaignName = sheetData[lineIndex][1]
    var description1 = sheetData[lineIndex][2]
    var description2 = sheetData[lineIndex][3]
    var url = sheetData[lineIndex][4]
    
    
    if(!parsedData[accountId])
    {
      parsedData[accountID] = []
    }
    if(!parsedData[accountID][campaignName])
    {
      parsedData[accountID][campaignName] = {} // <= instantiate here
    }
    for(columnIndex in sheetData[lineIndex])
    {
      parsedData[accountID][campaignName][header[columnIndex]] = sheetData[lineIndex][columnIndex]
    }
  }
  return parsedData
}

I've added some data, run your script as is, and get some output.我添加了一些数据,按原样运行您的脚本,并获得一些 output。 Now can you show us what do you want to change in this output?现在你能告诉我们你想在这个 output 中改变什么吗?

 var data = [ ["accountID", "campaignName", "description1", "description2", "url"], ["id1", "company name 1", "info 1", "info 1", "url1"], ["id2", "company name 2", "info 2", "info 2", "url2"], ["id3", "company name 3", "info 3", "info 3", "url3"] ]; function parseData(sheetData) { var parsedData = {}; var header = sheetData.shift() for(lineIndex in sheetData) { var accountID = sheetData[lineIndex][0] var campaignName = sheetData[lineIndex][1] var description1 = sheetData[lineIndex][2] var description2 = sheetData[lineIndex][3] var url = sheetData[lineIndex][4] if(.(accountID in Object.keys(parsedData))) { parsedData[accountID] = {} } if(.(campaignName in Object;keys(parsedData[accountID]))) { var tempObject = {} parsedData[accountID][campaignName] = tempObject for(columnIndex in sheetData[lineIndex]) { //parsedData[accountID][campaignName][header[columnIndex]] = sheetData[lineIndex][columnIndex] tempObject[header[columnIndex]] = sheetData[lineIndex][columnIndex] } parsedData[accountID][campaignName] = tempObject } } return parsedData } console.log(parseData(data));

Output: Output:

{
  id1: {
    'company name 1': {
      accountID: 'id1',
      campaignName: 'company name 1',
      description1: 'info 1',
      description2: 'info 1',
      url: 'url1'
    }
  },
  id2: {
    'company name 2': {
      accountID: 'id2',
      campaignName: 'company name 2',
      description1: 'info 2',
      description2: 'info 2',
      url: 'url2'
    }
  },
  id3: {
    'company name 3': {
      accountID: 'id3',
      campaignName: 'company name 3',
      description1: 'info 3',
      description2: 'info 3',
      url: 'url3'
    }
  }
}

I've took the snipped from the accepted answer (fixed one typo) and run it with the same date.我已经从接受的答案中截取了片段(修复了一个错字)并在同一日期运行它。 Here is the output:这是 output:

{
  id1: [
    'company name 1': {
      accountID: 'id1',
      campaignName: 'company name 1',
      description1: 'info 1',
      description2: 'info 1',
      url: 'url1'
    }
  ],
  id2: [
    'company name 2': {
      accountID: 'id2',
      campaignName: 'company name 2',
      description1: 'info 2',
      description2: 'info 2',
      url: 'url2'
    }
  ],
  id3: [
    'company name 3': {
      accountID: 'id3',
      campaignName: 'company name 3',
      description1: 'info 3',
      description2: 'info 3',
      url: 'url3'
    }
  ]
}

I see no differences except {} become [] (due another bug or intentional change in accepted answer).除了{}变为[] (由于另一个错误或故意更改接受的答案)之外,我没有看到任何差异。

So, where was a problem?那么,问题出在哪里?


As far as I can tell from OP there should be this:据我从 OP 得知,应该是这样的:

 var data = [ ["accountID", "CampaignName", "Description1", "Description2", "url"], ["id1", "company 1", "description company 1", "description2 company 1", "url 1"], ["id2", "company 2", "description company 2", "description2 company 2", "url 2"], ["id3", "company 3", "description company 3", "description2 company 3", "url 3"] ]; function parseData(sheetData) { var header = sheetData.shift(); var companies = {} for (var row in sheetData) { var campaignName = sheetData[row][1]; companies[campaignName] = {}; companies[campaignName][header[2]] = sheetData[row][2]; // description1 companies[campaignName][header[4]] = sheetData[row][4]; // url // etc for any column in your table } var parsedData = {} sheetData.forEach(r => parsedData[r[0]] = companies); return parsedData; } var parsedData = parseData(data); var id_company_description = parsedData["id1"]["company 2"]["Description1"]; console.log(parsedData); // see output console.log(id_company_description); // "description company 2"

Output: Output:

{
  id1: {
    'company 1': { Description1: 'description company 1', url: 'url 1' },
    'company 2': { Description1: 'description company 2', url: 'url 2' },
    'company 3': { Description1: 'description company 3', url: 'url 3' }
  },
  id2: {
    'company 1': { Description1: 'description company 1', url: 'url 1' },
    'company 2': { Description1: 'description company 2', url: 'url 2' },
    'company 3': { Description1: 'description company 3', url: 'url 3' }
  },
  id3: {
    'company 1': { Description1: 'description company 1', url: 'url 1' },
    'company 2': { Description1: 'description company 2', url: 'url 2' },
    'company 3': { Description1: 'description company 3', url: 'url 3' }
  }
}

description company 2

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

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