Как вернуть несколько значений с помощью карты - PullRequest
1 голос
/ 05 августа 2020

У меня есть функция, которая зацикливает массив, и у меня есть четыре if - если они соответствуют I pu sh значение для выходного массива:

const generate = (resources, resourceId) => {
    let output = [];

    for (let i = 0; i < resources.length; i++) {
        if (resources[i].id === resourceId) {
            if (CREATE & resources[i].privileges) {
                output.push(CREATE);
            }

            if (READ & resources[i].privileges) {
                output.push(READ);
            }

            if (UPDATE & resources[i].privileges) {
                output.push(UPDATE);
            }

            if (DELETE & resources[i].privileges) {
                output.push(DELETE);
            }
        }
    }

    return output;
};

Я хочу изменить эту функцию, чтобы использовать map - is Возможно? Я пытаюсь сделать что-то вроде этого:

const generateUsingMap = (resources, resourceId) => {
    return resources.map((resource) => {
        if (resource.id === resourceId) {
            if (CREATE & resource.privileges) {
                return CREATE;
            }
    
            if (READ & resource.privileges) {
                return READ;
            }
    
            if (UPDATE & resource.privileges) {
                return UPDATE;
            }
    
            if (UPDATE & resource.privileges) {
                return UPDATE;
            }
        }
    });
};

Но в этом случае у меня будет только одно значение, потому что оно возвращается из первого if. Может мне нужно использовать другую функцию? Я не хочу использовать for или forEach, потому что в этом случае мне нужно создать ненужную переменную.

Обновление

Моя функция работает в l oop, функция получает 2 аргумента resources и resourceId. Например, переменная resources содержит:

  {
    "id": "1",
    "name": "Test name 1",
    "privileges": 1
  },
  {
    "id": "2",
    "name": "Test name 2",
    "privileges": 2
  },
  {
    "id": "3",
    "name": "Test name 3",
    "privileges": 8
  },
  {
    "id": "4",
    "name": "Test name 4",
    "privileges": 0
  },
  {
    "id": "5",
    "name": "Test name 5",
    "privileges": 15
  }
]

Переменная resourceId содержит число (id) и получает отдельные значения, например, на первой итерации 1, для второй 2 и т. Д.

Для ресурсов из примера ожидаемый результат будет:

[1]
[2]
[8]
[]
[1,2,4,8]

Ответы [ 3 ]

1 голос
/ 05 августа 2020

Вы можете использовать сокращение, если и идентификатор объекта ресурса, и привилегии не существуют, не проверяйте дальше, просто верните то, что вы уже накопили.

Только если оба присутствуют, проверьте операции CRUD.

const result = resources.reduce((output) => {
  if (resources[i].id !== resourceId && !resources[i].privileges) {
    return output;
  }
  if (CREATE) {
    output.push(CREATE);
  }
  if (READ) {
    output.push(READ);
  }

  if (UPDATE) {
    output.push(UPDATE);
  }

  if (DELETE) {
    output.push(DELETE);
  }
  return output;
}, [])
0 голосов
/ 05 августа 2020
const generateUsingMap = (resources, resourceId) => {
    return resources.filter(resource => resource.id === resourceId)
        .map((resource) => {
            if (CREATE & resource.privileges) {
                return CREATE;
            }

            if (READ & resource.privileges) {
                return READ;
            }

            if (UPDATE & resource.privileges) {
                return UPDATE;
            }

            if (UPDATE & resource.privileges) {
                return UPDATE;
            }
        });
};
0 голосов
/ 05 августа 2020

Создать пустой массив resultArr. Перебрать resources через forEach и добавить к нему параметры. Вернуть массив в конце функции

const generateUsingMap = (resources, resourceId) => {
const resultArr = [];
resources.forEach((resource) => {
    if (resource.id === resourceId && resource.privileges) {
         if (CREATE) {
            resultArr.push(CREATE);
        }

        else if (READ) {
            resultArr.push(READ);
        }

        else if (UPDATE) {
            resultArr.push(UPDATE);
        }

        else if (DELETE) {
            resultArr.push(DELETE);
        }
    }
  });
 return resultArr;
};
...