как реализовать поиск по объекту по значению, если каждый из них инвестируется в годы и месяцы - PullRequest
0 голосов
/ 05 июня 2019

Я создал веб-сайт, и мне просто не удается выполнить поиск по многомерному массиву / объекту (я не знаю, в чем разница).

Перед добавлением года и месяца я получил к ним доступ напрямую по массиву идентификаторов [id] [field]

как реализовать поиск по вложенным структурам в многомерном массиве

Я попытался предварительно определить год и месяц с помощью дополнительных полей в интерфейсе. и это выглядит жутко и непостижимо.

{
  "2018": {
    "Aug": {
      "1": {
        "id": 1,
        "appeal_date": "2018-08-24",
        "city_of_residence": "aaa",
        "patient_name": "John",
        "patient_age": 62,
        "coordinator": "aaa",
        "source": "aaa",
        "birth_date": "1956-06-30",
        "contact_person_name": "",
        "contact_person_role": "",
        "contact_person_phones": [
          "",
          ""
        ],
        "diagnosis": "aasasd",
        "status": "9",
        "departure_date": "2016-02-18",
        "arrival_date": "2020-01-23",
        "patient_phones": [
          "",
          ""
        ],
        "editable": true
      }
    }
  },
  "2019": {
    "Oct": {
      "65": {
        "id": 65,
        "appeal_date": "2019-10-18",
        "city_of_residence": "asfsac",
        "patient_name": "asvsas",
        "patient_age": 62,
        "coordinator": "",
        "source": "asfasfa",
        "birth_date": "1956-06-30",
        "contact_person_name": "",
        "contact_person_role": "",
        "contact_person_phones": "",
        "diagnosis": "assdbcx",
        "status": "1",
        "departure_date": "",
        "arrival_date": "",
        "patient_phones": "",
        "editable": true
      }
    },
    "Jun": {
      "64": {
        "id": 64,
        "appeal_date": "2019-06-04",
        "city_of_residence": "afsfsa",
        "patient_name": "asvac",
        "patient_age": 62,
        "coordinator": "",
        "source": "agwdawdawd",
        "birth_date": "1956-06-30",
        "contact_person_name": "",
        "contact_person_role": "",
        "contact_person_phones": "",
        "diagnosis": "agsags",
        "status": "1",
        "departure_date": "",
        "arrival_date": "",
        "patient_phones": "",
        "editable": true
      }
    }
  }
}

все, что мне нужно, это обновить некоторые поля в нужном объекте

patients [2019] ['Oct'] [65] ['diagnosis'] = 'aaaaa'

как то так, но в определенный месяц пациент может быть не прав

Я бы хотел что-то вроде этого:

patients.nestingSearchByKey (65) ['diagnosis'] = 'aaaaa'

их идентификаторы уникальны и не повторяются

Я прошу прощения за мой английский

любые идеи, пожалуйста

Ответы [ 2 ]

3 голосов
/ 05 июня 2019

Вы можете использовать Object.keys, чтобы получить массив ключей в объекте.

var pts = {
  "2018": {
    "Aug": {
      "1": {
        "id": 1,
        "appeal_date": "2018-08-24",
        "city_of_residence": "aaa",
        "patient_name": "John",
        "patient_age": 62,
        "coordinator": "aaa",
        "source": "aaa",
        "birth_date": "1956-06-30",
        "contact_person_name": "",
        "contact_person_role": "",
        "contact_person_phones": [
          "",
          ""
        ],
        "diagnosis": "aasasd",
        "status": "9",
        "departure_date": "2016-02-18",
        "arrival_date": "2020-01-23",
        "patient_phones": [
          "",
          ""
        ],
        "editable": true
      }
    }
  },
  "2019": {
    "Oct": {
      "65": {
        "id": 65,
        "appeal_date": "2019-10-18",
        "city_of_residence": "asfsac",
        "patient_name": "asvsas",
        "patient_age": 62,
        "coordinator": "",
        "source": "asfasfa",
        "birth_date": "1956-06-30",
        "contact_person_name": "",
        "contact_person_role": "",
        "contact_person_phones": "",
        "diagnosis": "assdbcx",
        "status": "1",
        "departure_date": "",
        "arrival_date": "",
        "patient_phones": "",
        "editable": true
      }
    },
    "Jun": {
      "64": {
        "id": 64,
        "appeal_date": "2019-06-04",
        "city_of_residence": "afsfsa",
        "patient_name": "asvac",
        "patient_age": 62,
        "coordinator": "",
        "source": "agwdawdawd",
        "birth_date": "1956-06-30",
        "contact_person_name": "",
        "contact_person_role": "",
        "contact_person_phones": "",
        "diagnosis": "agsags",
        "status": "1",
        "departure_date": "",
        "arrival_date": "",
        "patient_phones": "",
        "editable": true
      }
    }
  }
}

function search(patients, id) {
  var patient;
  const years = Object.keys(patients);
  years.forEach(year => {
    const months = Object.keys(patients[year]);
    months.forEach(month => {
      if (patients[year][month][id]) {
        patient = patients[year][month][id];
      }
    });
  });
  
  return patient;
}

const p = search(pts, 64);
if (p) {
  p['status'] = 0;
  console.log(pts);
} else {
  console.log('Not find patient with id 64');
}
1 голос
/ 05 июня 2019

Если я вас правильно понял и вы сохраняете текущую структуру объекта, вам просто нужно проверить существование пациента:

var patient = patients[2019]['Oct'][65];

if (patient) {
    patient['diagnosis'] = 'aaaaa';
}
...