Отрисовать частичный объект JSON

У меня возникла проблема с отображением некоторых данных 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
      }
    }
  }
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
0
0
159
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
    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»), что не делает их динамическими. (Если я изменю эти имена, он больше не сможет работать).

Orlyyn 14.03.2018 11:12

Другие вопросы по теме