foreach не зацикливается на элементе? - PullRequest
0 голосов
/ 26 января 2019

У меня есть цикл для rxDetails, если любой rxNumber совпадает с данными, добавьте новое поле payAmount, если не вернуть элемент как есть, поэтому в моем ниже forEach он не возвращает 5 элементов, его всегда отсутствует rxNumber 15131503 взамен Любая идея, что здесь реализовано неправильно? я заметил, что forEach пропускает цикл на одном из элементов, не знаю почему.

данные

const rxDetails = [
  {
    "drugName": "TRILIPIX 135MG CPDR",
    "rxNumber": "15131523",
    "lldIndicator": "N"
  },
  {
    "drugName": "GILENYA 0.5MG CAPS",
    "rxNumber": "15131519",
    "lldIndicator": "N"
  },
  {
    "drugName": "JAKAFI 5MG TABS",
    "rxNumber": "15131503",
    "lldIndicator": "Y"
  },
  {
    "drugName": "FENOFIBRATE MICRONIZED 134MG CAPS",
    "rxNumber": "15131510",
    "lldIndicator": "N"
  },
  {
    "drugName": "LIPITOR 10MG TABS",
    "rxNumber": "15131506",
    "lldIndicator": "N"
  },
  {
    "drugName": "KEFLEX 750MG CAPS",
    "rxNumber": "15131522",
    "lldIndicator": "N"
  }
]

const data = [{
        "drugName": "TRILIPIX 135MG CPDR",
        "rxNumber": "15131523",
        "lldIndicator": "N",
        "payAmount": "10"
    },
    {
        "drugName": "GILENYA 0.5MG CAPS",
        "rxNumber": "15131519",
        "lldIndicator": "N",
        "payAmount": "8"
    },
    {
        "drugName": "METFORMIN",
        "rxNumber": "15425789",
        "lldIndicator": "Y",
        "payAmount": "0.50"
    },
    {
        "drugName": "FENOFIBRATE MICRONIZED 134MG CAPS",
        "rxNumber": "15131510",
        "lldIndicator": "N",
        "payAmount": "2.56"
    },
    {
        "drugName": "LIPITOR 10MG TABS",
        "rxNumber": "15131506",
        "lldIndicator": "N",
        "payAmount": "7.76"
    },
    {
        "drugName": "KEFLEX 750MG CAPS",
        "rxNumber": "15131522",
        "lldIndicator": "N",
        "payAmount": "17.88"
    }
]

main.ts

private getDrugsLastPrice(rxDetails: any, data: any) {
        let isDrugFound: boolean = false;
        const drugsArray: any = [];
        rxDetails.forEach((item: any) => {
            for (const element of data) {
                    if (item.rxNumber === element.rxNumber) {
                        isDrugFound = true;
                        const singleDrug = {
                            rxNumber: item.rxNumber,
                            lldIndicator: item.lldIndicator,
                            drugName: item.drugName,
                            payAmount: element.payAmount
                        };
                        drugsArray.push(singleDrug);
                    }

             }
            if (!isDrugFound) {
                drugsArray.push(item);
            }

        });

        return drugsArray;

    }

getDrugsLastPrice(rxDetails,data);

ожидаемый результат

[{
        "drugName": "TRILIPIX 135MG CPDR",
        "rxNumber": "15131523",
        "lldIndicator": "N",
        "payAmount": "10"
    },
    {
        "drugName": "GILENYA 0.5MG CAPS",
        "rxNumber": "15131519",
        "lldIndicator": "N",
        "payAmount": "8"
    },
    {
        "drugName": "JAKAFI 5MG TABS",
        "rxNumber": "15131503",
        "lldIndicator": "Y"
    },
    {
        "drugName": "FENOFIBRATE MICRONIZED 134MG CAPS",
        "rxNumber": "15131510",
        "lldIndicator": "N",
        "payAmount": "2.56"
    },
    {
        "drugName": "LIPITOR 10MG TABS",
        "rxNumber": "15131506",
        "lldIndicator": "N",
        "payAmount": "7.76"
    },
    {
        "drugName": "KEFLEX 750MG CAPS",
        "rxNumber": "15131522",
        "lldIndicator": "N",
        "payAmount": "17.88"
    }
]

Ответы [ 2 ]

0 голосов
/ 26 января 2019

Основная проблема, с которой вы столкнулись, заключается в том, что вам нужно было установить объявление isDrugFound в цикле forEach.Как только он установлен на true , он остается true , и это проблема.

Я упростил ваш код, поэтому вам не нужнологическое значение.

Использование Array # map, поиск Array #, распространение синтаксиса и деструктуризация.

const rxDetails=[{"drugName":"TRILIPIX 135MG CPDR","rxNumber":"15131523","lldIndicator":"N"},{"drugName":"GILENYA 0.5MG CAPS","rxNumber":"15131519","lldIndicator":"N"},{"drugName":"JAKAFI 5MG TABS","rxNumber":"15131503","lldIndicator":"Y"},{"drugName":"FENOFIBRATE MICRONIZED 134MG CAPS","rxNumber":"15131510","lldIndicator":"N"},{"drugName":"LIPITOR 10MG TABS","rxNumber":"15131506","lldIndicator":"N"},{"drugName":"KEFLEX 750MG CAPS","rxNumber":"15131522","lldIndicator":"N"}]
const data=[{"drugName":"TRILIPIX 135MG CPDR","rxNumber":"15131523","lldIndicator":"N","payAmount":"10"},{"drugName":"GILENYA 0.5MG CAPS","rxNumber":"15131519","lldIndicator":"N","payAmount":"8"},{"drugName":"METFORMIN","rxNumber":"15425789","lldIndicator":"Y","payAmount":"0.50"},{"drugName":"FENOFIBRATE MICRONIZED 134MG CAPS","rxNumber":"15131510","lldIndicator":"N","payAmount":"2.56"},{"drugName":"LIPITOR 10MG TABS","rxNumber":"15131506","lldIndicator":"N","payAmount":"7.76"},{"drugName":"KEFLEX 750MG CAPS","rxNumber":"15131522","lldIndicator":"N","payAmount":"17.88"}]

const res = rxDetails.map(item=>{
  const d = data.find(({rxNumber})=>rxNumber===item.rxNumber);
  return d ? {...item, payAmount: d.payAmount} : {...item};
});

console.log("Number of elements: " + res.length);
console.log("Number with payAmount prop: " + res.filter(o=>o.payAmount !== undefined).length);
console.log("Number without payAmount prop:" + res.filter(o=>o.payAmount === undefined).length);
console.log(res);
0 голосов
/ 26 января 2019

Вы никогда не сбрасываете isDrugFound в вашем forEach цикле.Как только будет найдено совпадение, на следующей итерации все равно будет установлено значение isDrugFound, равное true, поэтому оно не будет выдвинуто, если только оно не окажется в массиве данных.Фактически, как только найдено одно совпадение данных, будут отправлены только те элементы, которые находятся в массиве данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...