Реагировать - Фильтр массив получить все сообщения - PullRequest
1 голос
/ 13 мая 2019

Я пытаюсь создать фильтр React для фильтрации сообщений для каждого человека.Но я из идей пытаюсь получить правильный результат ....

0: {first_name: "dk", last_name: "k", email: "k@l.nl", message: "Email Sent", name: "test camp"}
1: {first_name: "asdfk", last_name: "lksdfl", email: "kk@l.nl", message: "Email Sent", name: "test camp"}
2: {first_name: "asdfkl", last_name: "lksdf", email: "salkdf@live.nl", message: "Email Sent", name: "test camp"}
3: {first_name: "asdklfjlk", last_name: "laskdfjlksdf", email: "ksdfsdaf@l.nl", message: "Email Sent", name: "test camp"}
4: {first_name: "asdfkl", last_name: "lksdjfkl", email: "kk@sds.nl", message: "Email Sent", name: "test camp"}
5: {first_name: "asdfkl", last_name: "lksdjfkl", email: "kk@sds.nl", message: "Clicked Link", name: "test camp"}

То, чего я хотел достичь, - это получить список сообщений для каждого пользователя.для пользователя "asdfkl" это будут сообщения [электронное письмо отправлено, ссылка нажата].

Есть идеи, как этого добиться в ответ?

Заранее спасибо

Ответы [ 3 ]

3 голосов
/ 13 мая 2019

Вы можете попробовать лучший подход с помощью Redu:

const people = [
  {
    first_name: 'dk',
    last_name: 'k',
    email: 'k@l.nl',
    message: 'Email Sent',
    name: 'test camp'
  },
  {
    first_name: 'asdfk',
    last_name: 'lksdfl',
    email: 'kk@l.nl',
    message: 'Email Sent',
    name: 'test camp'
  },
  {
    first_name: 'asdfkl',
    last_name: 'lksdf',
    email: 'salkdf@live.nl',
    message: 'Email Sent',
    name: 'test camp'
  },
  {
    first_name: 'asdklfjlk',
    last_name: 'laskdfjlksdf',
    email: 'ksdfsdaf@l.nl',
    message: 'Email Sent',
    name: 'test camp'
  },
  {
    first_name: 'asdfkl',
    last_name: 'lksdjfkl',
    email: 'kk@sds.nl',
    message: 'Email Sent',
    name: 'test camp'
  },
  {
    first_name: 'asdfkl',
    last_name: 'lksdjfkl',
    email: 'kk@sds.nl',
    message: 'Clicked Link',
    name: 'test camp'
  }
];

const getEmails = people.reduce((acc, cur) => {
  const user = cur.first_name;
  if (!acc[user]) {
    acc[user] = [];
  }
  acc[user] = [...acc[user], cur];
  return acc;
}, {});

console.log(getEmails);

2 голосов
/ 13 мая 2019

Вот пример для фильтрации вашего набора по first_name:

const people = [ { first_name: 'dk', last_name: 'k', email: 'k@l.nl', message: 'Email Sent', name: 'test camp' }, { first_name: 'asdfk', last_name: 'lksdfl', email: 'kk@l.nl', message: 'Email Sent', name: 'test camp' }, { first_name: 'asdfkl', last_name: 'lksdf', email: 'salkdf@live.nl', message: 'Email Sent', name: 'test camp' }, { first_name: 'asdklfjlk', last_name: 'laskdfjlksdf', email: 'ksdfsdaf@l.nl', message: 'Email Sent', name: 'test camp' }, { first_name: 'asdfkl', last_name: 'lksdjfkl', email: 'kk@sds.nl', message: 'Email Sent', name: 'test camp' }, { first_name: 'asdfkl', last_name: 'lksdjfkl', email: 'kk@sds.nl', message: 'Clicked Link', name: 'test camp' } ]; 

let getMessagesByFirstName = (name, data) => {
  let result = data.filter(x => x.first_name.includes(name)) || []
  if(result.length) {
    result = Array.from(result.reduce((r,{message}) => r.add(message), new Set()))
  }
  return result
}

console.log(getMessagesByFirstName('asdfkl', people))

и получить все сообщения в виде массива.

Идея состоит в том, чтобы сначала отфильтровать через Array.filter , а затем уменьшитьвозвращаемые данные устанавливаются только для сообщений через Array.reduce .Использование Set только для того, чтобы мы получали уникальные значения и не имели дубликатов в конечном массиве.

0 голосов
/ 13 мая 2019
const filteredMessagesList = name => {
    const messagesArray = [];
    personList.forEach(person => {
        if(person.name === name) {
            messagesArray.push(person.message);
        }
    });
    return messagesArray;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...