Комбинируйте функцию es6 каждые, суммируйте и возвращайте логическое значение - PullRequest
0 голосов
/ 12 октября 2018

У меня есть ответ JSON

{
    "nextAction": [{
            "userList": [{
                "id": 8,
                "email": "testemail@gmail.com",
                "name": "John Doe"
            }],
            "buttonLabel": "Finalize Now"
        },
        {
            "userList": [{
                "id": 10,
                "email": "newemail@gmail.com",
                "name": "Test User"
            }],
            "buttonLabel": "Start Now"
        }
    ]
}

Массив userList иногда содержит объект null.Я работаю над условием, которое удовлетворяет условиям ниже 3.

  1. Массив nextAction должен быть не пустым.
  2. Массив userList не должен содержать элемент null.
  3. В массиве userList должен присутствовать currentUser.

const data = [{
  "userList": [{
    "id": 8,
    "email": "testemail@gmail.com",
    "name": "John Doe"
  }],
  "buttonLabel": "Finalize Now"
},
{
  "userList": [{
    "id": 10,
    "email": "newemail@gmail.com",
    "name": "Test User"
  }],
  "buttonLabel": "Start Now"
}]

function checkForMyNextActions(myNextActions, currentUser) {
  const checkUsername = obj => obj.email === currentUser;
  return (myNextActions.forEach((myAction, index) => {
    (myAction.userList.length &&
      myAction.userList.every(userList =>
        userList !== null) &&
      myAction.userList.some(checkUsername)
    )
  }))
}

var result = checkForMyNextActions(data, "testemail@gmail.com")
console.log(result)

Ожидаемый результат верный, тогда как я получаю неопределенный.

Ответы [ 3 ]

0 голосов
/ 12 октября 2018

checkForMyNextActions возвращает неопределенное значение, поскольку forEach возвращает неопределенное значение.Используйте map для вызова функции каждого элемента в массиве и возврата нового массива с возвращаемыми значениями функций.Также внутренняя функция, переданная в forEach, ничего не возвращает.

0 голосов
/ 12 октября 2018

Вы можете сделать это через некоторые & find :

var obj = {
  "nextAction": [{
    "userList": [{
      "id": 8,
      "email": "testemail@gmail.com",
      "name": "John Doe"
    }],
    "buttonLabel": "Finalize Now"
  }]
}

const getUser = (usr) => obj.nextAction.some(({
    userList
  }) =>
  userList ? (userList.every(userList => userList !== null) &&
    userList.find(y => y.email === usr)) : false)

console.log(getUser("testemail@gmail.com")) // true
console.log(getUser("test@gmail.com")) // false

Приятной особенностью метода some является то, что он возвращает логическое значение, если один элемент соответствует условию, которое в нашем случае является внутренним find для электронной почты.

Вы можете пойти немного дальше и заставить функцию принимать поле для сопоставления, например:

var obj = { "nextAction": [{ "userList": [{ "id": 8, "email": "testemail@gmail.com", "name": "John Doe" }], "buttonLabel": "Finalize Now" }] }

const getUser = (field="email", usr) => obj.nextAction.some(({userList}) => 
  userList ? userList.find(y => y[field] === usr): false)

console.log(getUser("email", "testemail@gmail.com"))    // true
console.log(getUser("name", "John Doe"))                // true
0 голосов
/ 12 октября 2018

Вы можете просто использовать Array.reduce() для этого:

const data = [{ "userList": [{ "id": 8, "email": "testemail@gmail.com", "name": "John Doe" }], "buttonLabel": "Finalize Now" }];

function checkForMyNextActions(myNextActions, currentUser) {
  const checkUsername = obj => obj.email === currentUser;
  return myNextActions.reduce((a,curr)=>{
    let bool = curr.userList.length && curr.userList.every(userList =>userList !==null) &&  curr.userList.some(checkUsername);
    return bool && a;
  },true) != 0;
  
}

var result = checkForMyNextActions(data, "testemail@gmail.com")
console.log(result)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...