【问题标题】:JavaScript Objects, Arrays, confusion?JavaScript 对象、数组、混乱?
【发布时间】:2018-04-09 19:48:43
【问题描述】:

我的 JavaScript MQTT 客户端 (Paho)​​ 订阅了 MQTT 代理 (Mosquitto) 上的主题。 我使用 JSON.parse 将数组转换为对象。

client.onMessageArrived = onMessageArrived;
var myObj = JSON.parse(message.payloadString);

payload 看起来像这样,


{"applicationID":"4","applicationName":"Sensor-Module-241","deviceName":"P-241","devEUI":"00face0173800241","rxInfo":[{"mac":"0004a30b0022813c","rssi":-22,"loRaSNR":10.2,"name":"PiXCL-G000","latitude":45.485524299999994,"longitude":-75.6969496,"altitude":54}],"txInfo":{"frequency":903000000,"dataRate":{"modulation":"LORA","bandwidth":500,"spreadFactor":8},"adr":true,"codeRate":"4/5"},"fCnt":10101,"fPort":99,"data":"AGhQAXMq+AJnAHgDAAEEAAEFAQEGAQEHAgEYCAIB0A==","object":{"digitalInput":{"3":1,"4":1},"digitalOutput":{"5":1,"6":1},"analogInput":{"7":2.8,"8":4.64},"temperatureSensor":{"2":12},"humiditySensor":{"0":40},"barometer":{"1":1100}}}

使用 typeof 我得到,


 console.log('payLoadString: ', typeof 'payLoadString');//string
    console.log('message.payloadString: ', typeof message.payloadString);//string
    console.log('myObj: ', typeof myObj);//object
    console.log('myObj.applicationID: ', typeof myObj.applicationID);//string
    console.log('myObj.applicationName: ', typeof myObj.applicationName);//string
    console.log('myObj.deviceName: ', typeof myObj.deviceName);//string
    console.log('myObj.devEUI: ', typeof myObj.devEUI);//string
    console.log('myObj.rxInfo: ', typeof myObj.rxInfo);//object
    console.log('myObj.txInfo: ', typeof myObj.txInfo);//object
    console.log('myObj.fCnt: ', typeof myObj.fCnt);//number
    console.log('myObj.fPort: ', typeof myObj.fPort);//number
    console.log('myObj.data: ', typeof myObj.data);//string
    console.log('myObj.object: ', typeof myObj.object);//object

如果我执行以下操作,

  • 我的第一个 console.log 给了我一个数组???
  • 我将该数组分配给一个变量
  • 我的第二个 console.log 给了我一个数组???
  • 我的第三个 console.log 给了我一个对象???

我得到了我不明白的东西,

console.log('Object.entries(myObj): ', Object.entries(myObj));
   var n = Object.entries(myObj);
   console.log('typeof: n: ', n);
   console.log('typeof: Object.entries(myObj): ', typeof Object.entries(myObj));

Object.entries(myObj):  
Array [ […], […], […], […], […], […], […], […], […], […] ]
utility.js:114:2
typeof: n:  
Array [ […], […], […], […], […], […], […], […], […], […] ]
utility.js:116:2
typeof: Object.entries(myObj):  object

一开始我以为我用 JSON.parse 来制作对象,但现在我不知道它是什么。 然后,我想获取 rxInfo 以及 ??? 中包含的信息(名称:值)即命名对象(注意:此条目跟在带有名称 data 的条目之后),我也想从中获取单个 name:values 以及它们的 name:values。

总之,我想从我认为是来自 mqtt 代理的 json 消息中获取名称:值对,这样我就可以使用表中列中的名称和相邻列中的相应值浏览器中的表格。

我一直在尝试,但最终得到了各种看起来很奇怪的东西。 例如,这个 Object.entries(myObj.rxInfo[0]) 给了我

Array [ […], […], […], […], […], […], […] ]

我可以获取长度,并在此使用 Object.entries()、Object.keys() 和 Object.values(),但是当我尝试使用字符串键访问特定条目时, console.log(Object.entries(myObj.rxInfo[0].rssi)),我最终得到了

Array []

当我这样做时,

console.log(Object.entries(myObj.rxInfo[0]).rssi);

我结束了

undefined

啊啊啊啊! 我必须承认我对 JavaScript 不是很了解,但我认为这不会很难,结果变得很混乱。

【问题讨论】:

  • typeof <array> 返回"object",因为数组只是一个具有一些特殊属性的对象。
  • Object.entries 返回一个数组,因此为什么你会得到一个数组.... typeof 顺便说一下并没有给出"array" 类型的字符串。数组只是专门的对象,因此它给出了"object"

标签: javascript arrays object


【解决方案1】:

在数组上调用typeof 将返回导致混淆的对象,在您提供的示例中rxInfo 是一个数组。你可以试试myObj.rxInfo[0].rssi,你应该会看到你期望的值。

您可以使用isArray 或测试原型来检查对象是否为实际数组 Object.prototype.toString.call(data) == '[object Array]';

【讨论】:

  • 这就是答案。作为初学者,我发现在这里遇到的概念令人困惑。我想我想太多了,并试图利用复杂的方法来解决问题。在我的不理解中,当我看到的东西如此接近我想要的东西时,我认为这个问题对我来说太复杂了。我知道我应该避免说谢谢,但天哪,谢谢。
猜你喜欢
  • 2014-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-24
相关资源
最近更新 更多