У меня возникла проблема с отображением некоторых данных JSON в таблице React (которая поступает из таблицы реакции библиотеки). Вот пример json, с которым я работаю:
const translateditems = [
{
id: 1,
colonne1: [
{
language: 'en',
content: 'Column n°1'
},
{
language: 'fr',
content: 'Colonne n°1'
}
],
colonne2: [
{
language: 'en',
content: 'Column n°2'
},
{
language: 'fr',
content: 'Colonne n°2'
}
],
dateCreated: '2018 - 02 - 01 30: 00: 00.000'
}
]
Для выбранного языка мне нужно показать только один объект из переведенных текстов каждой колонки, если это необходимо. (В этом примере дату не нужно переводить на какой-либо конкретный язык)
Вот как я визуализирую свою таблицу реакций:
constructor () {
super()
this.state = {
data: translateditems
}
}
render () {
const { data } = this.state
const headers = []
// I use all the name fields in the first json object as headers
for (var key in Object.keys(data[0])) {
headers.push(Object({
'content': Object.keys(data[0])[key]
}))
}
return (
<div>
<ReactTable
data = {data}
columns = {headers.map(header => {
return ({
Header: header.content,
accessor: header.content
})
})
}
defaultPageSize = {10}
className='-striped -highlight'
/>
<br />
</div>
)
}
Вы знаете, как это сделать?
ОБНОВИТЬ
Вот что я сделал для решения своей проблемы:
return (
<div>
<ReactTable
data = {data}
columns = {headers.map(header => {
return ({
Header: header.content,
accessor: header.content,
// I added a function to apply on my Cell
Cell: row => (
<div>{this.renderTranslatedItem(data, header.content, row.index)}</div>
)
})
})
}
defaultPageSize = {10}
className='-striped -highlight'
/>
<br />
</div>
)
И вот функция, которую я сделал (предполагая, что lang - это язык, который я хочу):
renderTranslatedItem (data, column, rowIndex) {
// I check if the value is an array -> if it's not, then I return null
if (Object.prototype.toString.call(data[rowIndex][column]) !== '[object Array]') {
return null;
}
for (var i in data[rowIndex][column]) {
if (data[rowIndex][column][i].language === lang) {
return data[rowIndex][column][i].content
}
}
}

for (var key in Object.keys(data[0])) {
const headers = []
// I use all the name fields in the first json object as headers
headers.push(Object({
'content': Object.keys(data[0])[key]
}))
}
В моем примере я считаю, что lang передается через ваши реквизиты. Вы должны заменить его на:
const { lang } = this.props
const headers = Object.keys(data[0]).reduce(
(acc, key)=> {
return key!=='id' && key!=='dateCreated' && data[0][key][lang]
? { ...acc, [key] : data[0][key][lang] }
: { ...acc, [key]:null }
},{})
//console.info(headers) will output this:
{
colonne1:'colonne1',
colonne2:'colonne2'
}
Ваш ответ вдохновил на решение моей проблемы, спасибо! Однако вы полагаетесь на имена некоторых столбцов (например, «id» или «dateCreated»), что не делает их динамическими. (Если я изменю эти имена, он больше не сможет работать).