Функция карты JS не возвращает ни одного объекта - PullRequest
0 голосов
/ 23 января 2019

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

render(){
    const { data } = this.state;
    const simplifiedData = data && _.get(data, ['Soap:Envelope', 'Soap:Body', 'ReadMultiple_Result', 'ReadMultiple_Result', 'ItemCharacteristics']);
    const beautifiedData = _.map(simplifiedData, simple => _.reduce(simple, (r, value, key) => ({
        ...r,
        [key]: value['_text']
      }), {}));

        return (
            <div>
                {
                    beautifiedData.map((product, i) => {
                        return (
                                <ItemDetailsCard
                                    key={i}
                                    itemNo={product.Item_No}
                                    code={product.Code}
                                    Description_2={product.Description_2}
                                    GrossRequirement={product.GrossRequirement}
                                    ScheduledRcpt={product.ScheduledRcpt}
                                    ExpectedDate={product.ExpectedRcptDate}
                                    Inventory={product.Inventory}
                                    ProjAvailBalance={product.ProjAvailBalance}
                                />


                        );
                    })
                }

Вот пример ответа одного объекта:

{  
   "Soap:Envelope":{  
  "_attributes":{  
     "xmlns:Soap":"http://schemas.xmlsoap.org/soap/envelope/"
  },
  "Soap:Body":{  
     "ReadMultiple_Result":{  
        "_attributes":{  
           "xmlns":"urn:microsoft-dynamics-schemas/page/itemcharacteristics"
        },
        "ReadMultiple_Result":{  
           "ItemCharacteristics":{  
              "Key":{  
                 "_text":"44;GRUAAAJ7/zAAMQAtADAAMAAxADUAAAACewMwADUAMQ==9;4258681930;"
              },
              "Item_No":{  
                 "_text":"01-0015"
              },
              "Code":{  
                 "_text":"051"
              },
              "Description_2":{  
                 "_text":"ΜΑΥΡΟ"
              },
              "GrossRequirement":{  
                 "_text":"0"
              },
              "ScheduledRcpt":{  
                 "_text":"0"
              },
              "ExpectedRcptDate":{  
                 "_text":"0001-01-01"
              },
              "Inventory":{  
                 "_text":"0"
              },
              "ProjAvailBalance":{  
                 "_text":"0"
              }
           }
        }
     }
  }
 }

}

и пример массиваof of response:

{  
   "Soap:Envelope":{  
  "_attributes":{  
     "xmlns:Soap":"http://schemas.xmlsoap.org/soap/envelope/"
  },
  "Soap:Body":{  
     "ReadMultiple_Result":{  
        "_attributes":{  
           "xmlns":"urn:microsoft-dynamics-schemas/page/itemcharacteristics"
        },
        "ReadMultiple_Result":{  
           "ItemCharacteristics":[  
              {  
                 "Key":{  
                    "_text":"44;GRUAAAJ7/zAAMQAtADAAMAAwADgAAAACewMxADcAMg==9;4258681780;"
                 },
                 "Item_No":{  
                    "_text":"01-0008"
                 },
                 "Code":{  
                    "_text":"172"
                 },
                 "Description_2":{  
                    "_text":"ΜΠΛΕ"
                 },
                 "GrossRequirement":{  
                    "_text":"0"
                 },
                 "ScheduledRcpt":{  
                    "_text":"0"
                 },
                 "ExpectedRcptDate":{  
                    "_text":"0001-01-01"
                 },
                 "Inventory":{  
                    "_text":"41.1"
                 },
                 "ProjAvailBalance":{  
                    "_text":"41.1"
                 }
              },
              {  
                 "Key":{  
                    "_text":"44;GRUAAAJ7/zAAMQAtADAAMAAwADgAAAACewM2ADIAOA==9;4258681790;"
                 },
                 "Item_No":{  
                    "_text":"01-0008"
                 },
                 "Code":{  
                    "_text":"628"
                 },
                 "Description_2":{  
                    "_text":"ΧΡΥΣΟ"
                 },
                 "GrossRequirement":{  
                    "_text":"0"
                 },
                 "ScheduledRcpt":{  
                    "_text":"0"
                 },
                 "ExpectedRcptDate":{  
                    "_text":"0001-01-01"
                 },
                 "Inventory":{  
                    "_text":"40.2"
                 },
                 "ProjAvailBalance":{  
                    "_text":"40.2"
                 }
              },
              {  
                 "Key":{  
                    "_text":"44;GRUAAAJ7/zAAMQAtADAAMAAwADgAAAACewM3ADAAMw==9;4258681800;"
                 },
                 "Item_No":{  
                    "_text":"01-0008"
                 },
                 "Code":{  
                    "_text":"703"
                 },
                 "Description_2":{  
                    "_text":"ΓΚΡΕΝΑ"
                 },
                 "GrossRequirement":{  
                    "_text":"0"
                 },
                 "ScheduledRcpt":{  
                    "_text":"0"
                 },
                 "ExpectedRcptDate":{  
                    "_text":"0001-01-01"
                 },
                 "Inventory":{  
                    "_text":"34.1"
                 },
                 "ProjAvailBalance":{  
                    "_text":"34.1"
                 }
              }
           ]
        }
     }
  }
 }
}

Может ли кто-нибудь предоставить логику обработки ответа, который является единственным объектом?

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Вы можете использовать метод isArray.

Существует собственный в объекте Array, или вы можете использовать Lodash one , поскольку вы его используете.

const simplifiedData = data && _.get(data, ['Soap:Envelope', 'Soap:Body', 'ReadMultiple_Result', 'ReadMultiple_Result', 'ItemCharacteristics']);
const simplifiedDataArray = Array.isArray(simplifiedData) ? simplifiedData  : [simplifiedData]
// or in Lodash
// const simplifiedDataArray = _.isArray(simplifiedData) ? simplifiedData  : [simplifiedData]

Если вы хотите пойти по пути Lodash, хотя для этого есть метод, а именно castArray, который будет переносить все, что вы передаете ему, в массив, если он еще не был.

const simplifiedData = data && _.castArray(_.get(data, ['Soap:Envelope', 'Soap:Body', 'ReadMultiple_Result', 'ReadMultiple_Result', 'ItemCharacteristics']));
0 голосов
/ 23 января 2019

Похоже, вы используете lodash в своем коде, так как я вижу, что вы используете выражение подчеркивания. В этом случае попробуйте использовать _.castArray в ваших данных состояния, чтобы всегда использовать массив при рендеринге:

const beautifiedData = _.map(_.castArray(simplifiedData), simple => _.reduce(simple, (r, value, key) => ({
    ...r,
    [key]: value['_text']
}), {}));

Еще лучше: вы можете проверить и предварительно обработать ответ сервера перед обновлением состояния, чтобы state.data сохранял только массив, независимо от количества элементов в ответе.

...