Преобразование массива объектов в другой массив объектов? - PullRequest
1 голос
/ 21 марта 2020

Я искал похожий вопрос, и ни один из найденных мною действительно не соответствовал моей проблеме ...

РЕДАКТИРОВАТЬ: вся идея в том, чтобы разработать повторно используемый выпадающий компонент, где я передаю элементы прямо через реквизит. Эти элементы должны быть объектами с ключом (для значения поля) и свойством отображения (для текста значения). Чтобы выполнить преобразование, я использую функцию itemify. Весь этот код присутствует в компоненте формы, который будет включать раскрывающийся список.

Проблема выглядит следующим образом:

У меня есть массив объектов, которые я получаю с сервера. Цель состоит в том, чтобы сохранить этот массив объектов («старые объекты»), а также создать еще один («newObjects»). Этот новый массив должен содержать новые объекты, преобразованные из первого массива, но где:

newObject.key = oldObject.someProperty
newObject.display=oldObject.someOtherProperty

Чтобы сделать это преобразование, я создал функцию "itemify".

Теперь реальные результаты. Сначала я получаю данные с сервера. Затем я создаю другой массив, преобразовав тот, который получен API выборки.

getProfiles = async () => {
    const result = await fetch(apiConfig.profilesAPI);
    const body = await result.json();

    if (body.data.length>0){            
        let temp = body.data;
        console.log(temp);
        let buffer = body.data.map(x=>itemify(x,"id","desc"));  


        this.setState((state,props)=>({
            profiles: body.data,
            profileItems: buffer
        }));
    }
}

РЕДАКТИРОВАТЬ: это моя полная функция itemify

function itemify(obj,id,display) {
    let retVal = {
        key: obj[id],
        display: obj[display]
    }
    console.log("obj: "+obj);
    console.log("retVal: "+retVal);
    return retVal;
    // return {key:obj[id],display:obj[display]} //prior version had only this line
}

Если я go извлекаю консоль, у меня это:

My console

Первый журнал из первого фрагмента кода

console.log(temp); 

Скажите, если вам нужно больше кода. Эта часть кода еще не на github.

1 Ответ

1 голос
/ 22 марта 2020

Проблема решена!

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

Сначала я понял, что совершил ошибку при входе в консоль. Неправильный путь:

console.log("object " + object);

Правильный путь:

console.log("object",object);

Я думал, что делал что-то не так при преобразовании объектов. В конце концов, все было правильно с объектами и преобразованием.

Я обнаружил, что столкнулся с некоторой путаницей между управлением состоянием и реквизитом.

Я загружал реквизиты, отправленные из формы, в состояние дочернего компонента (выпадающий список) - который я теперь понимаю, что, возможно, это не имеет особого смысла.

Где я рендерил массив с элементами, используя

this.state.items.map(x=>renderItems(x))

, который я заменил на

this.props.items.map(x=>renderItems(x))

И теперь это работает! В конце концов, зачем управлять этим государством ... реквизита достаточно. Урок усвоен!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...