JS切片,拆分和解析

时间:2017-06-26 06:55:50

标签: javascript node.js formatting node-red

我在外面有一个带有DH22温度/湿度传感器的Raspberry Pi Zero。该传感器通过UDP传递读数,UDP由NodeRed中的UDP输入节点接收。

来自传感器的数据是一个字符串,格式如下:

"(64.4000015258789, 14.899999618530273)"

我对JS没有多少经验,但自从NodeRed开始以来我学到了很多东西。传递给函数的消息被描述为:“消息作为一个名为msg的JavaScript对象传入。按照惯例,它将包含一个包含消息正文的msg.payload属性。” 经过多次尝试和错误后,这是我认为应该工作的代码 - 但它没有......

var str = msg.payload;

var th = str.slice(0, -1);
th = th.split(",");

msg.payload[0] = parseFloat(th[0]);
msg.payload[1] = parseFloat(th[1]);

return [ msg.payload[0], msg.payload[1] ];

然而,我收到此错误:

"TypeError: Cannot assign to read only property '_msgid' of ("

从错误消息中我似乎正在尝试为msg.payload(msg.payload [0])的第一个字符赋值 - 在这种情况下是字符“(”。我有点感到困惑

编辑: 在NodeRed中,我正在使用具有两个输出的功能节点。因此,提到的输入字符串应该被剥离,拆分和解析为浮点数,然后返回到每个输出。要将数据发送到两个不同的输出,请执行以下操作:

return [ data1, data2 ]

Data1到输出1,data2到输出2.

2 个答案:

答案 0 :(得分:3)

使用replace()split()内嵌

var payload = "(64.4000015258789, 14.899999618530273)";

// remove the parentheses and split the remainder into an array
var arr = payload.replace( /[\(\)]/g, "" ).split( /\s*,\s*/ );

console.log( parseFloat( arr[ 0 ] ) );
console.log( parseFloat( arr[ 1 ] ) );

/\s*,\s*/中的RegExp split()会将字符串拆分为","", ";它处理逗号之前和/或之后存在任意数量空格的可能性 结果是生成的数组值自动为trimmed

OP代码中的错误原因

JS slice有两个参数:

  

begin可选
  从零开始的索引开始提取。
  可以使用负索引,指示距序列末尾的偏移量。 slice(-2)提取序列中的最后两个元素   如果begin未定义,则切片从索引0开始。

     

end可选
  基于零的索引,在此之前结束提取。切片提取但不包括结束。
  例如,切片(1,4)通过第四个元素(索引为1,2和3的元素)提取第二个元素   可以使用负索引,指示距序列末尾的偏移量。 slice(2,-1)通过序列中倒数第二个元素提取第三个元素   如果省略end,则切片通过序列的末尾(arr.length)提取   如果end大于序列的长度,则切片将在序列的末尾提取(arr.length)。

var foo = "(value, value)";

console.log( foo.slice( 0, -1 ) ); // "(value, value"

console.log( foo.slice( 1, -1 ) ); // "value, value"

阅读一些文档后

我认为下面的代码可能有效。基于有限的考试和零经验,这只是一个最好的猜测。

var arr = msg.payload.slice( 1, -1 ).split( /\s*,\s*/ );

msg.payload = { "value_name_1": arr[ 0 ], "value_name_2: arr[ 1 ] };
// or
msg.payload = arr;

return msg;

在以下2个文档中,修改了return msg;属性后的代码示例payload

这似乎是的完成方式。

答案 1 :(得分:0)

实际上,slicesplit的使用存在问题。

以下代码:

var th = str.slice(0, -1);
th = th.split(",");

应更改为:

var th = str.slice(1,-1).split(', ')

如果.slice()的第一个参数是0,则结果字符串将以"(",最终引入TypeError开头。