Основная проблема заключается в том, что ваш код предполагает, что сегменты OBR и OBX всегда будут отображаться попарно.
OBR|1|...
OBX|1|...
OBR|2|...
OBX|1|...
OBR|3|...
OBX|1|...
Однако, как только вы бежите в случае, когда число ОБР и OBX сегментов не совпадают, или не появляются в строго чередуясь, вещи начинают ломаться.
OBR|1|... oh oh, this obr is followed by two obx segments
OBX|1|...
OBX|2|...
OBR|2|... oh oh, this obr isn't followed by an obx segment at all.
OBR|3|...
OBX|1|...
Необходимо сначала понять, что подразумевается под следующими строками кода.
var obrSegments = msg['OBR'];
var obxSegments = msg['OBX'];
В этом примере obrSegments представляет собой массив, как вы догадались, сегментов Obr. Аналогично, obxSegments - это массив obxSegments. Ни один из этих массивов не был сконструирован с осознанием того, как сегменты obx были расположены относительно сегментов Obr.
Если вы можете гарантировать, что сегменты obr и сегменты obx в вашем сообщении всегда будут отображаться строго чередующимся образом, вы можете гарантировать, что obrSegments [i] и obxSegments [i] всегда будут последовательными.
С другой стороны, если количество сегментов obr и obx не идентично или, даже если число IS идентично, если сегменты не отображаются строго чередующимся образом, тогда нет никакой гарантии, что obrSegments [i] будет немедленно следовать obxSegments [i].
Формулировка вашего вопроса не является на 100% понятной. Однако я предполагаю, что всякий раз, когда вы просматриваете содержимое OBR, вы хотите условно изменить содержимое ВСЕХ сегментов obx, которые сразу же следуют за ним.
Я рекомендую нечто подобное.
var obrSegments = msg['OBR'];
// iterate through the OBR segments
for each (var obr in obrSegments) {
// extract the field components that you need from this OBR
// don't assume I've done this correctly. The text of your
// question didn't match your example code, so I don't exactly know what you need
var OBR4_1 = obr['OBR.4']['OBR.4.1'];
var OBR4_2 = obr['OBR.4']['OBR.4.2'];
// now iterate through the OBX segments that immediately follow this OBR.
// This is a bit tricky to do, but here's how I approach the problem
// you need an XML list of all the segments, not just the current OBR
var segments = obr.parent().children();
// you need to know the current OBR's index in the segments list
var obrIndex = obr.childIndex();
// theoretically, at this point, obr should refer to exactly the same
// data as segments[obrIndex]
// to do the actual OBX iteration:
var nextIndex = obrIndex + 1;
while (nextIndex < segments.length()) {
var nextSegment = segments[nextIndex];
var nextSegmentType = nextSegment.localName();
if (nextSegmentType == 'OBX') {
var obx = nextSegment;
// Bearing in mind that I haven't tested this code and have just been spewing it
// off into my web browser,
// you can now be confident that variable obx refers to one of the obx
// segments immediately following variable obr.
if (OBR4_1 == blah blah blah) {
obx['OBX.5']['OBX.5.1'] = blah blah blah;
obx['OBX.5']['OBX.5.2'] = blah blah blah;
}
else {
// looks like we've finished processing all the OBX segments for the current
// obr, time to break out of the inner loop.
break;
}
++nextIndex;
}
}
Ваш код не соответствует вашему описанию, что вы пытаетесь сделать. Вы говорите, что, когда сегмент OBR имеет определенные значения, вы хотите установить определенные значения в OBX. Однако, глядя на ваш код, становится ясно, что вы сравниваете значения между OBR и OBX. – csj
Добавьте этот вопрос к http://area51.stackexchange.com/proposals/51758/healthcare-it. Мы пытаемся получить сайт обмена стеками Healthcare, и это будет прекрасный вопрос. – ChronoFish