Структурировать ассоциативный массив для json - PullRequest
0 голосов
/ 27 апреля 2020

Я пытаюсь создать ассоциативный массив внутри функции. Функция извлекает информацию с веб-сайта. У меня возникают проблемы при создании json, который выдает:

[{
  Cardiology_STEMI : [ 
     {name: Dr. John},
     {service name: Cardiology STEMI}
     {office: 973-111-1111},
     {shift: 7a-7p},
     {cell : 973-222-2222}]
}
{ Pulmonary : [
     {name: Dr.Bob},
     {office: (123)456-789},
     {service_name: Pulmonary},
     {shift: 7a-7p},
     {cell: (123)456-789}
}]
   [...and so on (x 30 entries])


Я не могу понять, как заставить имя службы отображаться вне основного массива, чтобы он стал ассоциативным массивом , Когда я пытаюсь изменить вывод данных, он никогда не выходит правильно.

<!--Example of what the page looks like 

<td class = "Cardiology specialty"> Cardiology STEMI </td>
<td class = "Cardiology specialty name"> Dr. John </td>
<td class = "Cardiology specialty shift"> 7a-7p </td>
<td class = "Cardiology specialty office"> (973)-111-1111 </td>
<td class = "Cardiology specialty cell"> (973)-222-2222 </td>

<td class = "Pulmonary specialty"> Pulmonary </td>
<td class = "Pulmonary specialty name"> Dr. Bob </td>
<td class = "Pulmonary specialty shift"> 7a-7p </td>
<td class = "Pulmonary specialty office"> (123)456-7890 </td>
<td class = "Pulmonary specialty cell"> (123)456-7890 </td>
-->
<script>
$(document).ready(function(){

var providers = []
var cardiology = data("Cardiology");
          providers.push(cardiology);

var pulmonary = data("Pulmonary");
          providers.push(pulmonary);

var json = JSON.stringify(providers);
sendData(json);


   function data(specialty){
     var service = $("."+specialty+".service:lt(1)").text().trim().replace(/\s/g,"_");
     var service_name = $("."+specialty+".service:lt(1)").text();
     var name = $("."+specialty+".name:lt(1)").text();
     var shift = $("."+specialty+".shift:lt(1)").text();
     var office = $("."+specialty+".office:lt(1)").text();
     var cell = $("."+specialty+".cell:lt(1)").text();

        var data = {
           service: service_name, 
           name: name, 
           shift: shift, 
           office: office, 
           cell: cell};

    return data
   }; 

function sendData(data){
    $.post('https://www.empa.app/api/submit_providers',    
       { providers: data },                               
       function(data, status, jqXHR) {                  
                $('p').append('status: ' + status + ', data: ' + data);
        })
     }
})
</script>

Может кто-нибудь помочь мне подсказать, где я могу упустить что-то важное или сделать что-то не так?

1 Ответ

0 голосов
/ 27 апреля 2020

Если для «ассоциативного массива» вы имеете в виду «структуру, позволяющую хранить данные в виде key: value пар», то да, у нас это есть. В JS у нас есть Object.

. Существуют различные способы создания таких структур, наиболее распространенным способом (также, способ , предпочтительный и рекомендуемый JS разработчиками), является через литерал объекта {}. Данные, содержащиеся в таких структурах, могут быть доступны по-разному; предполагаемый способ - точка-нотация obj.key, но массивоподобный метод доступа obj["key"] эквивалентен:

var planet = {
    name: "Earth",
    greeting: "Hello, world!"
};

console.log("Planet", planet.name, "says:", planet["greeting"]);
// Planet Earth says: Hello, world!

Интересный факт: Array s в JS - это особый тип Object, где каждый key является целым числом. Я не буду go вдаваться в детали, хотя вместо этого я настоятельно рекомендую поискать Mozilla Developer JavaScript справочник , чтобы узнать больше о фундаментальных структурах JS.

Что касается вашей первоначальной проблемы, вы можете создать структуру, подобную этой:

var list = {
    Cardiology_STEMI: {
        "Dr. John": {
            office: "973-111-1111",
            shift: "7a-7p",
            cell: "973-222-2222"
        },
        "Dr. Mike": {
            office: "973-333-3333",
            shift: "4a-4p",
            cell: "973-444-4444"
        },
        "Dr. Paul": {
            office: "973-555-5555",
            shift: "4a-4p",
            cell: "973-666-6666"
        }
    },
    Pulmonary: {
        "Dr. Bob": {
            office: "(123)456-789",
            shift: "7a-7p",
            cell: "(123)456-789"
        },
        "Dr. Bruce":{
            office: "(987)654-321",
            shift: "7a-7p",
            cell: "(987)654-321"
        },
        "Dr. Banner":{
            office: "(999)888-777",
            shift: "7a-7p",
            cell: "(999)888-777"
        }
    }
};

И затем, извлекая данные для определенного c доктора, используя массивоподобный метод доступа:

var DrMike = list.Cardiology_STEMI["Dr. Mike"];
var DrBanner = list.Pulmonary["Dr. Banner"];

console.log(DrMike, DrBanner);
// {name: "Dr. Mike", office: "973-333-3333", shift: "4a-4p", cell: "973-444-4444"}
// {name: "Dr. Banner", office: "(999)888-777", shift: "7a-7p", cell: "(999)888-777"}

В качестве альтернативы, реальный массив будет более полезным, если вы лучше познакомитесь с filter(), map(), find() (и другими) методами объектов Array:

var list = {
    Cardiology_STEMI: [
        {
            name: "Dr. John",
            office: "973-111-1111",
            shift: "7a-7p",
            cell: "973-222-2222",
        },{
            name: "Dr. Mike",
            office: "973-333-3333",
            shift: "7a-7p",
            cell: "973-444-4444",
        },{
            name: "Dr. Paul",
            office: "973-555-5555",
            shift: "7a-7p",
            cell: "973-666-6666",
        }
    ],
    Pulmonary: [
        {
            name: "Dr. Bob",
            office: "(123)456-789",
            shift: "7a-7p",
            cell: "(123)456-789",
        },{
            name: "Dr. Bruce",
            office: "(987)654-321",
            shift: "7a-7p",
            cell: "(987)654-321",
        },{
            name: "Dr. Banner",
            office: "(999)888-777",
            shift: "7a-7p",
            cell: "(999)888-777",
        }
    ]
};

Найти определенный c врач в определенной c категории:

var DrMike = list.Cardiology_STEMI.find(drDetails=>{
    return (drDetails.name === "Dr. Mike");
});
console.log(DrMike);
// {name: "Dr. Mike", office: "973-333-3333", shift: "4a-4p", cell: "973-444-4444"}

var DrBanner = list.Cardiology_STEMI.find(drDetails=>{
    return (drDetails.name === "Dr. Banner");
});
console.log(DrBanner);
// {name: "Dr. Banner", office: "(999)888-777", shift: "7a-7p", cell: "(999)888-777"}

Чтобы найти врачей-кардиологов_STEMI, доступных с 4:00 до 16:00:

var cardiology_STEMI_avail_4AM_4PM = list.Cardiology_STEMI.filter(drDetails => {
    return (drDetails.shift === "4a-4p");
});

console.log(cardiology_STEMI_avail_4AM_4PM);
// [
//  {name: "Dr. Mike", office: "973-333-3333", shift: "4a-4p", cell: "973-444-4444"}
//  {name: "Dr. Paul", office: "973-555-5555", shift: "4a-4p", cell: "973-666-6666"}
// ]

Надеюсь, это поможет :)

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