Как экспортировать результаты вызова API в CSV со значениями одного ответа в одной строке? - PullRequest
0 голосов
/ 31 марта 2020

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

    [
    {
        "What time is it?": [
            "option_2"
        ]
    },
    {
        "When will we go home?": [
            "option_1"
        ]
    },
    {
        "When is your birthday?": [
            "2050"
        ]
    },
    {
        "How much do you sleep?": [
            "Ajajajsjiskskskskdkdj"
        ]
    }
],
[
    {
        "What time is it?": [
            "option_2"
        ]
    },
    {
        "When will we go home?": [
            "option_1"
        ]
    },
    {
        "When is your birthday?": [
            "10181"
        ]
    },
    {
        "How much do you sleep?": [
            "Ajskossooskdncpqpqpwkdkdkskkskskksksksksks"
        ]
    }
]

Теперь, реагируя, я хочу экспортировать результаты в csv. Я могу сделать это путем экспорта в CSV, но здесь проблема с форматированием. Я хочу, чтобы значения каждого вопроса одного ответа в одной строке под их ярлыками (вопросами). Поэтому, если у меня есть два ответа, как указано выше, я хочу экспортировать их в две строки, а не в 8, так как всего 8 вопросов. Вот как я хочу, чтобы он экспортировался. export-data

Я пробовал до сих пор, но не повезло.

это моя функция экспорта данных

exp =()=>{

  const raw = []
  console.log(this.state.data[0].sbm_id)
    axios.get(`/dashboard/${this.props.proj_id}/whole_sub/`)
        .then(res=>{
          // console.log('1')
          // console.log(res.data[0][0])
          // console.log('2')
          for (let i =0;i<this.state.data.length;i++){
            for(let j = 0;j<res.data[0].length;j++){
         // let sub=[]
          //res.data[i][j].ID = this.state.data[i].sbm_id
            raw.push(res.data[i][j])
            }
          }
        }
        )

          let curr = this.state
          curr.exp = raw
          this.setState({exp:curr.exp})



        }

Вот моя функция экспорта

rawExport=()=>{


  const csvExporter = new ExportToCsv(optionsExp);

  csvExporter.generateCsv(this.state.exp);

}

1 Ответ

0 голосов
/ 31 марта 2020

Первый шаг - сгладить исходный вложенный массив, чтобы получить массив однородной формы, затем вы продолжаете уменьшать его.

const data = [
	[
		{
			"What time is it?": [
				"option_2"
			]
		},
		{
			"When will we go home?": [
				"option_1"
			]
		},
		{
			"When is your birthday?": [
				"2050"
			]
		},
		{
			"How much do you sleep?": [
				"Ajajajsjiskskskskdkdj"
			]
		}
	],
	[
		{
			"What time is it?": [
				"option_2"
			]
		},
		{
			"When will we go home?": [
				"option_1"
			]
		},
		{
			"When is your birthday?": [
				"10181"
			]
		},
		{
			"How much do you sleep?": [
				"Ajskossooskdncpqpqpwkdkdkskkskskksksksksks"
			]
		}
	]
];

const flattenArray = (arr) => [].concat.apply([], arr);

// Flatten the initial array
const flattenedArray = flattenArray(data);

// Keep on reducing the flattened array into an object
var res = flattenedArray.reduce((acc, curr) => {
	const [key, val] = flattenArray(Object.entries(curr));
	if (!acc[key]) {
		acc[key] = [].concat(val);
	} else {
		val.forEach(x => {
			if (!acc[key].includes(x)) {
				acc[key].push(x);
			}
		});
	}
	return acc;
}, {});

console.log(res);
...