Функция вызывается несколько раз - PullRequest
1 голос
/ 07 августа 2020

У меня есть массив объектов

const data = [{
  Description: "confirm"
  Id: "1"
  Name: "confirm"
  Value: "VIP:confirm"
}, {
  Description: "validate"
  Id: "2"
  Name: "validate"
  Value: "VIP:validate"
}, {
  Description: "Sent"
  Id: "2"
  Name: "Sent"
  Value: "VIP:Sent"
}]

Теперь я пытаюсь получить описание, передав значение:

const valuesObject = [
  "VIP:Confirmed",
  "VIP:Validated",
  "VIP:Sent"
]

Теперь данные значений похожи на

const getDescription = (
  value: string,
  Values: Array < >
) => {
  let allValues = _.find(Values, item => item.Value === value)
  return resolve(allValues)
}

const resolve = (object) => {
  return object?.Description ? object.Description : object?.Name ?? ''
}

Теперь, вот я,

const status = valuesObject.map((value) => {
  return getDescription(value, data)
})
return status.join('/')

Я ожидал, что он должен вернуть мне Подтверждено / Проверено / Отправлено

Он возвращается, но функция вызывается несколько раз. кто-нибудь может мне с этим помочь?

1 Ответ

0 голосов
/ 07 августа 2020

Используйте _.intersectionWith(), чтобы получить объекты со свойством Value, которое соответствует одному из массива значений. Затем сопоставьте, чтобы получить Description или Name:

const getDescription = (arr, values) => _.map(
  _.intersectionWith(arr, values, (o, v) => o.Value === v), // get all objects with matching values
  ({ Description, Name = '' }) => Description || Name // map to description / name / empty string
).join('/')

const data = [{"Description":"Confirmed","Id":"1","Name":"confirm","Value":"VIP:Confirmed"},{"Description":"Validated","Id":"2","Name":"validate","Value":"VIP:Validated"},{"Description":"Sent","Id":"2","Name":"Sent","Value":"VIP:Sent"}]

const valuesObject = ["VIP:Confirmed","VIP:Validated","VIP:Sent"]

const result = getDescription(data, valuesObject)

console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.19/lodash.js"></script>

Используя lodash / fp, вы можете сгенерировать функцию getDescription() с помощью _.flow():

const getDescription = _.flow(
  _.intersectionWith((o, v) => o.Value === v), // get all objects with matching values
  _.map(({ Description, Name = '' }) => Description || Name), // map to description / name / empty string
  _.join('/')
)

const data = [{"Description":"Confirmed","Id":"1","Name":"confirm","Value":"VIP:Confirmed"},{"Description":"Validated","Id":"2","Name":"validate","Value":"VIP:Validated"},{"Description":"Sent","Id":"2","Name":"Sent","Value":"VIP:Sent"}]

const valuesObject = ["VIP:Confirmed","VIP:Validated","VIP:Sent"]

const result = getDescription(data, valuesObject)

console.log(result)
<script src='https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js)'></script>
...