У меня есть файл json, вызываемый запросом fetch, который выглядит так:
[
{
"type": "1",
"flight": {
"_id": {
"value": "eydWZXJzaW9uJzogJzIwMDYuMDEnLCAnVHJhbnNhY3Rpb25JZGVudGlmaWVyJzogJ1RJRCQxNTU3MDMzNTMyNzMzMjQ3NDIzOTUtMS5hYXB1dzU0MycsICdQcmltYXJ5TGFuZ0lEJzogJ2VuLXVzJywgJ0Nvb2tpZXMnOiB7J0pTRVNTSU9OSUQnOiAnODAyQTM2RTdFRjNDNjI4NTlFOUVDQkJBOTc4QTAxRDIuYWFwdXc1NDMnLCAnYWVyb0lEJzogJzkwMDg3MTIxMDE1NTcwMzM1MzIxNTU3MDMzNTMyODI0MDE1J30sICdTZXF1ZW5jZU51bWJlcic6ICcxJywgJ2NsYXNzTmFtZSc6ICdZJywgJ29yZ2luRGVzdGluYXRpb25PcHRpb25zJzogW3snbnMxOkZsaWdodFNlZ21lbnQnOiB7J0BBcnJpdmFsRGF0ZVRpbWUnOiAnMjAxOS0wNS0xNVQwNzoyMDowMCcsICdARGVwYXJ0dXJlRGF0ZVRpbWUnOiAnMjAxOS0wNS0xNVQwNjoyMDowMCcsICdARmxpZ2h0TnVtYmVyJzogJ1c1MTE1MCcsICdASm91cm5leUR1cmF0aW9uJzogJ1BUMUgzME0wLjAwMFMnLCAnQFJQSCc6ICdXNSRJS0EvRVZOJDM3NjI4NCQyMDE5MDUxNTA2MjAwMCQyMDE5MDUxNTA3MjAwMCcsICduczE6RGVwYXJ0dXJlQWlycG9ydCc6IHsnQExvY2F0aW9uQ29kZSc6ICdJS0EnfSwgJ25zMTpBcnJpdmFsQWlycG9ydCc6IHsnQExvY2F0aW9uQ29kZSc6ICdFVk4nfX19LCB7J25zMTpGbGlnaHRTZWdtZW50JzogeydAQXJyaXZhbERhdGVUaW1lJzogJzIwMTktMDUtMTlUMTY6NDU6MDAnLCAnQERlcGFydHVyZURhdGVUaW1lJzogJzIwMTktMDUtMTlUMTQ6NDU6MDAnLCAnQEZsaWdodE51bWJlcic6ICdXNTExNTEnLCAnQEpvdXJuZXlEdXJhdGlvbic6ICdQVDFIMzBNMC4wMDBTJywgJ0BSUEgnOiAnVzUkRVZOL0lLQSQzNzY1MDMkMjAxOTA1MTkxNDQ1MDAkMjAxOTA1MTkxNjQ1MDAnLCAnbnMxOkRlcGFydHVyZUFpcnBvcnQnOiB7J0BMb2NhdGlvbkNvZGUnOiAnRVZOJ30sICduczE6QXJyaXZhbEFpcnBvcnQnOiB7J0BMb2NhdGlvbkNvZGUnOiAnSUtBJ319fV0sICdwYXNzZW5nZXJfdGF4JzogeydpbmZhbnRzJzogMCwgJ2NoaWxkcyc6IDAsICdhZHVsdHMnOiA3MDE4MDAwLjB9LCAndG90YWxfdGF4JzogNzAxODAwMC4wLCAndG90YWxfd2l0aG91dF90YXgnOiAxNTE3ODAwMC4wLCAnY3VycmVuY3knOiAnSVJSJ30 = ",
"provider": {
"provider_id": "2",
"dmnid": "3984-5cb59eca68f75451df7f828f"
}
},
"info": {
"departureinformation": {
"routeshow": {
"dateinfo": [
{
"startdeparture": [
{
"_id": 10648.0,
"sstring": "1398-02-25",
"mstring": "2019-05-15",
"weekday": "4"
}
],
"enddeparture": [
{
"_id": 10648.0,
"sstring": "1398-02-25",
"mstring": "2019-05-15",
"weekday": "4"
}
]
}
]
}
}
},
"total": 21361210.0,
"totalCom": 21361210.0,
"commissioncost": 0.0
}
},
{
"type": "2",
"id": {
"hotelId": "105254",
"provider": {
"provider_id": "23",
"dmnid": 3984.0
}
},
"hotelinfo": {
"name": "CVK Park Bosphorus Hotel",
"hotelsearch": {
"realname": "CVK Park Bosphorus Hotel",
"hotelid": 0.0,
"hotelimage": "",
"star": 5.0
}
}
},
{
"type": "2",
"id": {
"hotelId": "105256",
"provider": {
"provider_id": "23",
"dmnid": 3984.0
}
},
"hotelinfo": {
"name": "CVK Hotel",
"hotelsearch": {
"realname": "CVK Hotel",
"hotelid": 0.0,
"hotelimage": "",
"star": 5.0
}
}
},
{
"type": "2",
"id": {
"hotelId": "105252",
"provider": {
"provider_id": "23",
"dmnid": 3984.0
}
},
"hotelinfo": {
"name": "Bosphorus Hotel",
"hotelsearch": {
"realname": "Bosphorus Hotel",
"hotelid": 0.0,
"hotelimage": "",
"star": 5.0
}
}
}
]
Как видите, у каждого объекта json есть поле с именем type. Например, если бы было 100 объектов, 99 объектов имели бы поле type со значением 2, а 1 объект имел бы поле type со значением 1. Я хочу, чтобы объект от type=1 был добавлен ко всем объектам от type=2.
class App extends React.Component {
constructor(props) {
super(props);
this.state = {
data: [],
library: null,
perPage: 20,
currentPage: 1,
maxPage: null,
}
}
componentDidMount() {
fetch('/json.bc', {
method: 'get',
})
.then(response => response.text())
.then(text => {
let Maindata = JSON.parse(text.replace(/\'/g, '"'))
this.setState(state => ({
...state,
data: Maindata
}), () => {
this.reorganiseLibrary()
})
}).catch(error => console.error(error))
}
reorganiseLibrary = () => {
const { perPage, data } = this.state;
let library = data;
library = _.chunk(library, perPage);
this.setState({
library,
currentPage: 1,
maxPage: library.length === 0 ? 1 : library.length
})
}
// Previous Page
previousPage = event => {
this.setState({
currentPage: this.state.currentPage - 1
})
}
// Next Page
nextPage = event => {
this.setState({
currentPage: this.state.currentPage + 1
})
}
// handle per page
handlePerPage = (evt) =>
this.setState({
perPage: evt.target.value
}, () => this.reorganiseLibrary());
// handle render of library
renderLibrary = () => {
const { library, currentPage } = this.state;
if (!library || (library && library.length === 0)) {
return <div>NOResult</div>
}
return library[currentPage - 1].map((item, i) => (
<div className = "Wrapper">{this.rendermain(item, i)}</div>
))
}
render() {
const { library, currentPage, perPage, maxPage } = this.state;
return (
<div>
{this.renderLibrary()}
<ul id = "page-numbers">
<li className = "nexprevPage">
{currentPage !== 1 && (
<button onClick = {this.previousPage}><span className = "fa-backward"></span></button>
)}
</li>
<li className = "controlsPage activeCnt">{this.state.currentPage}</li>
<li className = "restControls">...</li>
<li className = "controlsPage">{this.state.maxPage}</li>
<li className = "nexprevPage">
{(currentPage < maxPage) && (
<button onClick = {this.nextPage}><span className = "fa-forward"></span></button>
)}
</li>
</ul>
</div>
)
}
rendermain(element, i) {
let type = element.type
let saveProduct = ""
let productToBeAdded = ""
if (type == '2') {
saveProduct = <div className = "box-hotel">{element.hotelinfo.name}</div>
}
if (type == '1') {
productToBeAdded = <div className = "box-flight"><img src = {element.flight.info.departureinformation.ticketinfooo.showstartairline} width = "100" height = "40" alt = "" /> </div>
}
let final = saveProduct.push(productToBeAdded)
console.info(final)
return final
}
}
ReactDOM.render(<App />, document.getElementById('Result'))
Я пытался использовать push, но была эта ошибка: saveProduct.push is not a function





Сначала получите объект с помощью "type": "1"
const type1 = data.find(({ type }) => type === '1');
Затем выполните цикл data, и если идентификатор равен "1", верните его, иначе объедините type1 с текущим объектом.
const mergedData = data.map(obj => obj.type === '1' ? obj : { ...type1, ...obj });
Изменить componentDidMount на это
componentDidMount() {
fetch('/json.bc')
.then(response => response.json())
.then(data => {
const type1 = data.find(({ type }) => type === '1');
const mergedData = data.map(obj => obj.type === '1' ? obj : { ...type1, ...obj });
this.setState(state => ({
...state,
data: mergedData,
}), this.reorganiseLibrary);
}).catch(console.error);
}
Спасибо @Asaf Aviv за ваш ответ. Извините, но не могли бы вы показать это в моем коде? Я почти понял, что вы имеете в виду, но я не знаю, как использовать это в моем коде.
Обновлен ответ, проверьте его и дайте мне знать
Спасибо @Asaf Aviv, но похоже, что объекты не будут объединены. когда я пишу console.info(mergedData), он показывает мне json по умолчанию без объединения типов = 1 по типу = 2. и когда я пишу: return library[currentPage - 1].map((item, i) => ( {item.hotelinfo.name} )) в ответ, будет эта ошибка: item.hotelinfo is undefined
Сначала найдите объект с типом 1 и добавьте его к объекту с типом 2. Вот так: repl.it/repls/FloweryVagueApplications