为什么不能使用对象提供的键访问对象中的值?

蒂芙尼·威尔逊(Tiffany G.Wilson)

我正在尝试使用Google Apps脚本中的Javascript从对象生成数组,以便将数组写入工作表。我有一个对象campers,其中包含一个由唯一数字标识的每个人的对象。当我尝试访问此人的记录时,我不确定。功能如下:

function processData(data){  // Returning from client with full object - parse and write to spreadsheet
  Logger.log(data)
  var campers = data; // All camper data and headers
  var headers = campers.headers; // Array of ordered questions
  var nHeaders = headers.length;
  var array = [];  // Array to build - each row is one camper

  for (uid in campers){ // All objects in campers object
    if (uid!='headers'){ // want campers only
      Logger.log(uid);
      Logger.log(campers[uid]);
      var row = [];
      for (var j=0; j<nHeaders; j++){  // Go through all questions
        if(campers[uid][headers[j]]) row.push(campers[uid][headers[j]]); // Add that value to the array if it exists
        else row.push(null);
      }
      array.push(row);
    }
  }
  var final = ss.getSheetByName('ParseUpload');
  final.getRange("A1").offset(0,0,array.length, nHeaders).setValues(array);
  return; 
}

当我运行它时,我得到以下日志:

[16-08-12 02:07:31:240 PDT] {headers=[Card Number, Unique ID, Last Name, First Name, Email, Status], 123456={Status=Non-Attend, Unique ID=123456, [email protected], First Name=John, Card Number=456789012, Last Name=Doe}, 987654={Status=Attend, Unique ID=987654, [email protected], First Name=Jane, Card Number=5, Last Name=Doe}, 1234567={Status=Attend, Unique ID=1234567, [email protected], First Name=John, Card Number=123456789, Last Name=Smith}}
[16-08-12 02:07:31:298 PDT] 123456
[16-08-12 02:07:31:299 PDT] undefined
[16-08-12 02:07:31:300 PDT] 987654
[16-08-12 02:07:31:301 PDT] undefined
[16-08-12 02:07:31:301 PDT] 1234567
[16-08-12 02:07:31:302 PDT] undefined

为什么uid肯定是其中一个键的valuecampers返回undefinedcampers[uid]呢?我搜索了类似的问题,并找到了有关如何使用方括号表示法访问对象的参考,但是对于在已定义的内容上变得未定义(我认为)没有任何帮助。请告诉我,这里显然有什么我想念的,或者如果这确实是重复的,请直接问另一个问题。

这是以下内容的结构data

{
    "headers": ["Card Number", "Unique ID", "Last Name", "First Name", "Email", "Status"],
    "123456": {
        "First Name": "John",
        "Unique ID": 123456,
        "Email": "test3#test.edu",
        "Card Number": 456789012,
        "Last Name": "Doe",
        "Status": "Non-Attend"
    },
    "987654": {
        "First Name": "Jane",
        "Unique ID": 987654,
        "Email": "[email protected]",
        "Card Number": 5,
        "Last Name": "Doe",
        "Status": "Attend"
    },
    "1234567": {
        "First Name": "John",
        "Unique ID": 1234567,
        "Email": "[email protected]",
        "Card Number": 123456789,
        "Last Name": "Smith",
        "Status": "Attend"
    }
}

编辑如果我campers直接使用上面的结构在函数中定义,它可以正常工作:

function processData(){ 
    var campers = {
    "headers": ["Card Number", "Unique ID", "Last Name", "First Name", "Email", "Status"],
    "123456": {
        "First Name": "John",
        "Unique ID": 123456,
        "Email": "[email protected]",
        "Card Number": 456789012,
        "Last Name": "Doe",
        "Status": "Non-Attend"
    },
    "987654": {
        "First Name": "Jane",
        "Unique ID": 987654,
        "Email": "[email protected]",
        "Card Number": 5,
        "Last Name": "Doe",
        "Status": "Attend"
    },
    "1234567": {
        "First Name": "John",
        "Unique ID": 1234567,
        "Email": "[email protected]",
        "Card Number": 123456789,
        "Last Name": "Smith",
        "Status": "Attend"
    }
}
  var headers = campers.headers; // Array of ordered questions
  var nHeaders = headers.length;
  var array = [];  // Array to build - each row is one camper

  for (uid in campers){ // All objects in campers object
    if (uid!='headers'){ // want campers only
      Logger.log(uid);
      Logger.log(campers[uid]);
      var row = [];
      for (var j=0; j<nHeaders; j++){  // Go through all questions
        if(campers[uid][headers[j]]) row.push(campers[uid][headers[j]]); // Add that value to the array if it exists
        else row.push(null);
      }
      array.push(row);
    }

  }
  Logger.log(array);
  //var final = ss.getSheetByName('ParseUpload');
  //final.getRange("A1").offset(0,0,array.length, nHeaders).setValues(array);
  return; 
}

这有帮助吗?也许有人可以campers理解为什么本地定义有效,但是当以传入时,它不起作用data

编辑2我尝试了一些其他日志记录,而没有更改其余功能:

var keys = Object.keys(campers);
Logger.log(keys)
for (var uid in campers){ // All objects in campers object

  if (uid!='headers'){ // want campers only
    Logger.log(uid);
    Logger.log(keys.indexOf(uid));
    Logger.log(campers[uid]);
    Logger.log(campers[keys[0]]);
    Logger.log(campers[Object.keys(campers)[0]]);
    Logger.log(campers[123456]);
    Logger.log(campers['123456']);
    var row = [];
    for (var j=0; j<nHeaders; j++){  // Go through all questions
      if(campers[uid][headers[j]]) row.push(campers[uid][headers[j]]); // Add that value to the array if it exists
      else row.push(null);
    }
    array.push(row);
  }
}

这是结果日志:

[16-08-12 07:37:57:069 EDT] [123456, 987654, 1234567, headers]
[16-08-12 07:37:57:070 EDT] 123456
[16-08-12 07:37:57:072 EDT] 0.0
[16-08-12 07:37:57:073 EDT] undefined
[16-08-12 07:37:57:074 EDT] undefined
[16-08-12 07:37:57:075 EDT] undefined
[16-08-12 07:37:57:075 EDT] undefined
[16-08-12 07:37:57:076 EDT] undefined

因此uid可以在键列表中找到,但是似乎无法以某种方式访问​​这些值。啊!

蒂芙尼·威尔逊(Tiffany G.Wilson)

我仍然不知道是什么引起了问题,但我找到了解决方法。感谢TJ.Crowder的评论要求我显示JSON.stringify(data)结果,并想知道该对象是否不是标准的JavaScript对象,因此在输入函数时尝试了以下操作:

var data2 = JSON.stringify(data);
var campers = JSON.parse(data2);

出于某种原因,将对象转换为JSON字符串然后立即返回对象是可行的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么在对象初始化期间不能使用部分限定的名称空间?

来自分类Dev

为什么WCF代理对象不能访问全局静态对象?

来自分类Dev

为什么不能使用String初始化StringBuilder对象?

来自分类Dev

为什么不能使用滑块设置AxWindowsMediaPlayer对象的音量?

来自分类Dev

为什么我不能使用int访问map键?

来自分类Dev

为什么不能从对象访问常量?

来自分类Dev

Rails:为什么不能使用由ajax创建的对象来触发javascript?

来自分类Dev

为什么不能使用FileInputStream来填充MessageDigest对象?

来自分类Dev

为什么使用数组作为键访问对象中的元素?

来自分类Dev

为什么在馈给json.dumps()的Python对象中不能使用true / false / null?

来自分类Dev

为什么逗号不能包含在Javascript对象键中?

来自分类Dev

为什么我不能使用从Objective-C对象到Swift属性的KVC?

来自分类Dev

为什么我不能使用Set对象调用Array.prototype.map

来自分类Dev

为什么不能使用std :: ref将对象传递到Boost.Python模块中?

来自分类Dev

为什么我不能直接访问let作用域函数中使用的对象而不是Kotlin中的对象?

来自分类Dev

为什么Kotlin中的对象不能使用密封修饰符?

来自分类Dev

为什么不能使用带范围的for循环打印对象矢量的内容?

来自分类Dev

为什么红宝石不能使用大多数2 ^ X数字作为对象ID?

来自分类Dev

为什么我不能使用计算为同一字符串的不同类型访问对象属性?

来自分类Dev

为什么我不能使Revit中的这些对象的ElementID与Revit文件中的对象匹配?

来自分类Dev

为什么我不能访问对象的属性?

来自分类Dev

为什么我不能使用api响应更新状态?数据是对象数组

来自分类Dev

为什么我们不能使用单个ListItem对象在DropDownList ASP.net中添加项目

来自分类Dev

为什么不能使用滑块设置AxWindowsMediaPlayer对象的音量?

来自分类Dev

为什么我不能使用包含mysqli对象的属性?

来自分类Dev

为什么不能使用索引访问此数组?

来自分类Dev

为什么我不能使用php访问mysql?

来自分类Dev

为什么不能通过字典键和对象引用设置 .NET 对象属性值?

来自分类Dev

为什么我不能使用嵌套的 IntList 创建对象?

Related 相关文章

  1. 1

    为什么在对象初始化期间不能使用部分限定的名称空间?

  2. 2

    为什么WCF代理对象不能访问全局静态对象?

  3. 3

    为什么不能使用String初始化StringBuilder对象?

  4. 4

    为什么不能使用滑块设置AxWindowsMediaPlayer对象的音量?

  5. 5

    为什么我不能使用int访问map键?

  6. 6

    为什么不能从对象访问常量?

  7. 7

    Rails:为什么不能使用由ajax创建的对象来触发javascript?

  8. 8

    为什么不能使用FileInputStream来填充MessageDigest对象?

  9. 9

    为什么使用数组作为键访问对象中的元素?

  10. 10

    为什么在馈给json.dumps()的Python对象中不能使用true / false / null?

  11. 11

    为什么逗号不能包含在Javascript对象键中?

  12. 12

    为什么我不能使用从Objective-C对象到Swift属性的KVC?

  13. 13

    为什么我不能使用Set对象调用Array.prototype.map

  14. 14

    为什么不能使用std :: ref将对象传递到Boost.Python模块中?

  15. 15

    为什么我不能直接访问let作用域函数中使用的对象而不是Kotlin中的对象?

  16. 16

    为什么Kotlin中的对象不能使用密封修饰符?

  17. 17

    为什么不能使用带范围的for循环打印对象矢量的内容?

  18. 18

    为什么红宝石不能使用大多数2 ^ X数字作为对象ID?

  19. 19

    为什么我不能使用计算为同一字符串的不同类型访问对象属性?

  20. 20

    为什么我不能使Revit中的这些对象的ElementID与Revit文件中的对象匹配?

  21. 21

    为什么我不能访问对象的属性?

  22. 22

    为什么我不能使用api响应更新状态?数据是对象数组

  23. 23

    为什么我们不能使用单个ListItem对象在DropDownList ASP.net中添加项目

  24. 24

    为什么不能使用滑块设置AxWindowsMediaPlayer对象的音量?

  25. 25

    为什么我不能使用包含mysqli对象的属性?

  26. 26

    为什么不能使用索引访问此数组?

  27. 27

    为什么我不能使用php访问mysql?

  28. 28

    为什么不能通过字典键和对象引用设置 .NET 对象属性值?

  29. 29

    为什么我不能使用嵌套的 IntList 创建对象?

热门标签

归档