2017-02-08 4 views
0

Я использую узел-красный и у меня есть следующий входящий msg.payload:Перебор массива и анализ

[ "=00ECY20WA200_RECV_P1SEL", "true", "=00ECY20WA200_RECV_P2SEL", "true", "=00ECY20WA300_RECV_P2SEL", "true", "=00ECY20WA300_RECV_P1SEL", "true", "=00ECY20WA202_RECV_P1SEL", "true", "=00ECY20WA202_RECV_P2SEL", "false", "=00ECY20WA303_RECV_P2SEL", "true", "=00ECY20WA303_RECV_P1SEL", "true", "=00ECY20WA204_RECV_P1SEL", "false", "=00ECY20WA204_RECV_P2SEL", "true", "=00ECY20WA305_RECV_P2SEL", "false", "=00ECY20WA305_RECV_P1SEL", "false", "=00ECY20WA205_RECV_P1SEL", "false", "=00ECY20WA205_RECV_P2SEL", "false", "=00ECY20WA306_RECV_P1SEL", "true", "=00ECY20WA306_RECV_P2SEL", "true", "=00ECY20WA206_RECV_P1SEL", "false", "=00ECY20WA206_RECV_P2SEL", "true", "=00ECY20WA307_RECV_P1SEL", "true", "=00ECY20WA307_RECV_P2SEL", "true", "=00ECY20WA207_RECV_P1SEL", "false", "=00ECY20WA207_RECV_P2SEL", "false", "=00ECY20WA308_RECV_P1SEL", "false", "=00ECY20WA308_RECV_P2SEL", "true", "=00ECY20WA208_RECV_P1SEL", "false" ] 

Я пытаюсь разобрать все элементы, которые являются «истинными» и сцепить их в массиве (recivingAlarms), анализируемый элемент - тот, который находится непосредственно перед булевым оператором. Я пытаюсь сделать это с циклом for, и я уверен, что создал бесконечный цикл, я не уверен, как его исправить. Вот что у меня есть:

var recievingAlarms = []; 

for (i = 1; i < msg.payload.length; i+2) 
    if(msg.payload[i] === true) { 
    recievingAlarms.concat(msg.payload[i-1]); 
    } 
msg.payload = recievingAlarms; 
return msg; 
+5

вместо 'я + 2' использование' я + = 2'. Изменить условие 'msg.payload [i] === true' to' msg.payload [i] == true', так как '' true ''является строкой или сравнивается со строкой' 'true'' вместо boolean 'true '. А также 'recievingAlarms = recievingAlarms.concat (msg.payload [i-1]);' – RaR

+0

Или даже, 'msg.payload [i] === 'true'' –

ответ

1

Это ваше решение прямо сейчас

var recievingAlarms = []; 

for (i = 1; i < msg.payload.length; i=i+2) 
    if(msg.payload[i] == "true") { 
     recievingAlarms=recievingAlarms.concat(msg.payload[i-1]); 
    } 
msg.payload = recievingAlarms; 
return msg; 
3

Ваш цикл бесконечен, потому что вы не увеличивающиеся i, чтобы увеличить i вам нужно будет заменить i+2 с i += 2, в заказать переназначить его значение:

var receivingAlarms = []; 

for (var i = 1; i < msg.payload.length; i += 2) { 
    if(msg.payload[i] === "true") { //replace true with "true" 
    receivingAlarms.push(msg.payload[i-1]); //replace concat with push because msg.payload[i - 1] is not an Array 
    } 
} 

msg.payload = receivingAlarms; 
return msg; 

Кроме того, необходимо изменить .concat() к .push() - .concat() используется для объединения/объединения двух массивов, но результат msg.payload[i-1] не является массивом. Также необходимо изменить условную проверку для true, чтобы проверить строку String "true", так как значения в массиве полезных данных - это строки, не являющиеся булевыми.

+0

Одна маленькая опечатка: вы забыли открыть скобу '' '' для тела 'для'! –

+0

ahh спасибо! будет обновляться – hackerrdave

1
  1. i никогда не увеличивается, так что условие цикла никогда не будет оценивать ложь (i всегда будет меньше, чем .length).
  2. "true" и true не одного типа (одна строка, а другая - булева). Сравните вместо msg.payLoad[i] с номером "true".
  3. concat concats два массива. Используйте push, чтобы добавить новый элемент в массив.

так:

var recievingAlarms = []; 

for (i = 1; i < msg.payload.length; i += 2) 
    if(msg.payload[i] === "true") 
     recievingAlarms.push(msg.payload[i - 1]); 

msg.payload = recievingAlarms; 
Смежные вопросы