Как отобразить и создать объект на основе другого объекта

#javascript #reactjs #typescript #react-native #mapping

Вопрос:

Поэтому я вызываю api и сохраняю результат в вызванном состоянии shift и получаю следующий результат:

 [
    {
        "id": 123,
        "status": "created",
        "expected": {
            "end_time": "2021-10-01",
            "start_time": "2021-10-01"
        },
    },
    {
        "id": 567,
        "status": "created",
        "expected": {
            "end_time": "2021-09-30",
            "start_time": "2021-09-30"
        },
    }
]
 

Теперь я отображаю это состояние сдвига следующим образом:

 {shift.map((item: any, key: any) => (
    <>
        <ShiftComponent
            Name={'name'}
            StartTime={item.expected.start_time}
            EndTime={item.expected.end_time}
            Address={'address'}
        />
    </>
))}
 

Чтобы получить это name , address мне нужно вызвать другой api, используя идентификатор из первого api, поэтому я извлек идентификаторы из первого api в массиве:

 id = ["123", "567"]
 

а затем вызов второго api и сохранение результата в value состоянии:

 for (let i = 0; i < id.length; i  ) {
    ApiCall.get(Url   'value/'   id[i])
        .then(async (resp) => {
            if (resp) {
                setValue(resp.data);
            } else {
                Alert.alert('Error', resp);
            }
        })
        .catch((err: any) => {
            console.log(err);
        });
}
 

результат второго api:

 {  
    "address": {
        "state": "anice state",
        "city": "nice city",
    },
    "name": "Nice name",
    "id": "123"
}
{  
    "address": {
        "state": "anice state 2",
        "city": "nice city 2",
    },
    "name": "Nice name 2",
    "id": "567"
}
 

Основываясь на результатах второго api, как я могу указать имя и адрес в своем ShiftComponent . Я попытался сопоставить уже сопоставленные shift , но это создает дубликаты и неправильные результаты.

P.S.: Я показал только 2 примера вывода в вызове моего api, на самом деле их гораздо больше

Пожалуйста, помогите, я не могу найти решение для этого.!!

Ответ №1:

Если вам действительно нужно вызывать свой API отдельно для каждого id , вы можете либо переместить этот вызов, ShiftComponent либо обернуть его другим компонентом, который позаботится о вызове. То, как вы это делаете сейчас, содержит недостаток:

 for (let i = 0; i < id.length; i  ) { // <-- this is a loop
    ApiCall.get(Url   'value/'   id[i])
        .then(async (resp) => {
            if (resp) {
                setValue(resp.data); // <-- this will overwrite state with every API response
            } else {
                Alert.alert('Error', resp);
            }
        })
        .catch((err: any) => {
            console.log(err);
        });
}
 

Вызов setValue в цикле, подобном этому, означает, что вы сохраняете только последний ответ от API. Опять же, самое простое решение этой проблемы-сделать один вызов API в каждом дочернем компоненте. Это может выглядеть примерно так:

 {shift.map((item: any, key: any) => (
    <ShiftComponent // make the API call inside this component
        id={item.id}
        StartTime={item.expected.start_time}
        EndTime={item.expected.end_time}
    />
))}