lodash фильтрация вложенных json - PullRequest
1 голос
/ 18 марта 2019

Привет, у меня есть следующие данные json ...

    {
    "contacts":
    [
        {
            "contactId": "00001",
            "firstName": "test",
            "lastName": "test",
            "email": "test@test.com",
            "phone": "0207 0000000",
            "role": "Surveyor",
            "customer": "00001",
            "projects": [{"projId": "00002"}]
        },
        {
            "contactId": "00002",
            "firstName": "test1",
            "lastName": "test1",
            "email": "test@test.com",
            "phone": "0207 1111111",
            "role": "Manager",
            "customer": "00001",
            "projects": [{"projId": "00002"}, {"projId": "00003"}]
        }
    ]
}

Мне нужна конечная точка API, которая возвращает контакты на основе projID, но у меня проблемы, потому что projId вложен в массив проектов ...

    //Get contacts by Project
app.get('/v1/projcontacts/:id', function(req, res) {
    var id = req.params.id;
    var projContacts = lodash.filter(contactData.contacts, { 'projId': id });
    res.json(projContacts);
})

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

Ответы [ 3 ]

1 голос
/ 18 марта 2019

Вы можете попробовать что-то вроде этого:


const data = {
    "contacts":
    [
        {
            "contactId": "00001",
            "firstName": "test",
            "lastName": "test",
            "email": "test@test.com",
            "phone": "0207 0000000",
            "role": "Surveyor",
            "customer": "00001",
            "projects": [{"projId": "00002"}]
        },
        {
            "contactId": "00002",
            "firstName": "test1",
            "lastName": "test1",
            "email": "test@test.com",
            "phone": "0207 1111111",
            "role": "Manager",
            "customer": "00001",
            "projects": [{"projId": "00002"}, {"projId": "00003"}]
        }
    ]
};

const projId = "00003";

// E.g Filter by project ID "00003"
const results = data.contacts.filter(x => x.projects.some(x => x.projId === projId));

console.log(JSON.stringify(results, null, 4));
1 голос
/ 18 марта 2019

Вы можете попробовать что-то вроде этого:

app.get('/v1/projcontacts/:id', function(req, res) {
  var id = req.params.id;
  var projContacts = contacts.filter(
    contact => contact.projects.map(
      projects => projects.projId === id
    ).includes(true)
  )
  res.json(projContacts);
})
0 голосов
/ 18 марта 2019

Лодаш может быть излишним для этого.Вы можете использовать .some(), что дает дополнительное преимущество при досрочном выходе при обнаружении первого совпадения:

app.get('/v1/projcontacts/:id', function(req, res) {
    var id = req.params.id;
    var projContacts = contactData.contacts.filter(contact => {
        return contact.projects.some(project => project.projId === id);
    });
    res.json(projContacts);
})
...