【问题标题】:Convert API response from string to array of objects将 API 响应从字符串转换为对象数组
【发布时间】:2021-09-11 10:46:28
【问题描述】:

如何将 API 响应从字符串转换为对象数组?

我正在按如下方式进行 GET 调用,我得到的结果作为一个很长的字符串返回:

const state = {
    strict: true,
    airports: []
};

const getters = {
    allAirports: (state) => state.airports,
};

const actions = {
    getAirports({ commit }) {
        axios.get('https://raw.githubusercontent.com/jpatokal/openflights/master/data/airports.dat')
            .then(response => {
                commit('SET_AIRPORTS', response.data)
            })
    }
};

const mutations = {
    SET_AIRPORTS(state, airports) {
        state.airports = airports
    }
};

响应是:

1,"Goroka Airport","Goroka","Papua New Guinea","GKA","AYGA",-6.081689834590001,145.391998291,5282,10,"U","Pacific/Port_Moresby","airport","OurAirports" 2,"Madang Airport","Madang","Papua New Guinea","MAG","AYMD",-5.20707988739,145.789001465,20,10,"U","Pacific/Port_Moresby","airport","OurAirports" 3,"Mount Hagen Kagamuga Airport","Mount Hagen","Papua New Guinea","HGU","AYMH",-5.826789855957031,144.29600524902344,5388,10,"U","Pacific/Port_Moresby","airport","OurAirports" 4,"Nadzab Airport","Nadzab","Papua New Guinea","LAE","AYNZ",-6.569803,146.725977,239,10,"U","Pacific/Port_Moresby","airport","OurAirports" 5,"Port Moresby Jacksons International Airport","Port Moresby","Papua New Guinea","POM","AYPY",-9.443380355834961,147.22000122070312,146,10,"U","Pacific/Port_Moresby","airport","OurAirports" 6,"Wewak International Airport","Wewak","Papua New Guinea","WWK","AYWK",-3.58383011818,143.669006348,19,10,"U","Pacific/Port_Moresby","airport","OurAirports" 7,"Narsarsuaq Airport","Narssarssuaq","Greenland","UAK","BGBW",61.1604995728,-45.4259986877,112,-3,"E","America/Godthab","airport","OurAirports" 8,"Godthaab / Nuuk Airport","Godthaab","Greenland","GOH","BGGH",64.19090271,-51.6781005859,283,-3,"E","America/Godthab","airport","OurAirports" 9,"Kangerlussuaq Airport","Sondrestrom","Greenland","SFJ","BGSF",67.0122218992,-50.7116031647,165,-3,"E","America/Godthab","airport","OurAirports"

但是,我的目标是一旦调用,这个字符串被分成几个对象,并添加到airports数组中,如下所示:

airports: [
  {
   id: 1,
   name: 'Goroka Airport',
   city: 'Goroka',
   country: 'Papua New Guinea',
   iata: 'GKA',
   icao: 'AYGA',
   longitude: -6.081689834590001,
   latitude: 145.391998291
  }
  {
   etc...
  }
]

您能告诉我如何实现上述目标吗?

【问题讨论】:

标签: javascript vue.js split


【解决方案1】:

试试这个,用简单易懂的代码编写

var WholeString = [1,"Goroka Airport","Goroka","Papua New Guinea","GKA","AYGA",-6.081689834590001,145.391998291,5282,10,"U","Pacific/Port_Moresby","airport","OurAirports",2,"Madang Airport","Madang","Papua New Guinea","MAG","AYMD",-5.20707988739,145.789001465,20,10,"U","Pacific/Port_Moresby","airport","OurAirports"];


var fullarray = WholeString;    //.split(',');

var i = 0;
var airportArray = []; 

fullarray.forEach(function callbackFn(value, index) {

  if (typeof airportArray[i] == 'undefined') {
    airportArray[i] = [];
  }
    
  airportArray[i].push(value);
  
  if((index+1)%14==0 && index!=0)
  {
    i++;
  }

});


var j = 0;
var finalArr = [];
airportArray.forEach(function callbackFn(value, index) {
    finalArr.push({
        id: value[0],
        name: value[1],
        city: value[2],
        country: value[3],
        iata: value[4],
        icao: value[5],
        longitude: value[6],
        latitude: value[7],
    });

});


console.log(finalArr);

【讨论】:

    【解决方案2】:
    1. 要获取各行数据,请使用String.prototype.split()\n 作为来自URL 的文本响应的分隔符。

    2. 使用Array.prototype.map()转换每一行:

      一个。使用String.prototype.split(), 作为分隔符,从行中解析逗号分隔的字段。

      b.使用 String.prototype.replace()regular expression that matches leading/trailing quotes 和一个空字符串作为替换,从字段中去除多余的引号。

      c。返回具有所需命名字段的对象。

    const actions = {
      getAirports({ commit }) {
        axios
          .get('https://raw.githubusercontent.com/jpatokal/openflights/master/data/airports.dat')
          .then(response => {
            // 1️.
            const lines = response.data.split('\n');
            // 2️.
            const airports = lines.map(line => {
              const fields = line.split(',') // 2a.
                                .map(x => x.replace(/(^"|"$)/g, '')); // 2b.
    
              // 2c.
              return {
                id: fields[0],
                name: fields[1],
                city: fields[2],
                country: fields[3],
                iata: fields[4],
                icao: fields[5],
                longitude: fields[6],
                latitude: fields[7],
              };
            });
    
            commit('SET_AIRPORTS', airports);
          })
      }
    };
    

    demo

    【讨论】:

    • 您好托尼,感谢您的回答!我最喜欢你的方法,非常感谢!
    【解决方案3】:

    如果你确定对象的长度,那么你可以试试这个

    const prototype = {
       id: '',
       name: '',
       city: '',   
       country: '',
       iata: '',
       icao: '',
       longitude: '',
       latitude: ''
    }
    const arr = [1,"Goroka Airport","Goroka","Papua New Guinea","GKA","AYGA",-6.081689834590001,145.391998291]
    let chunked = []  //* final  output
    let chunk = 8 //* chunk length
    
    
    
    for (let i = 0; i< arr.length; i+=chunk) {
      let obj = {}
      let temp = arr.slice(i, i+chunk)
      
     
      Object.keys(prototype).map((key,i)=>{
         obj[key] = temp[i]
      })
      chunked = [...chunked,obj]
    }
    
    
    console.log(chunked)
    

    const prototype = {
       id: '',
       name: '',
       city: '',   
       country: '',
       iata: '',
       icao: '',
       longitude: '',
       latitude: ''
    }
    const arr = [1,"Goroka Airport","Goroka","Papua New Guinea","GKA","AYGA",-6.081689834590001,145.391998291]
    let chunked = []  //* final  output
    let chunk = 8 //* chunk length
    
    
    
    for (let i = 0; i< arr.length; i+=chunk) {
      let obj = {}
      let temp = arr.slice(i, i+chunk)
      
     
      Object.keys(prototype).map((key,i)=>{
         obj[key] = temp[i]
      })
      chunked = [...chunked,obj]
    }
    
    
    console.log(chunked)

    【讨论】:

      猜你喜欢
      • 2022-11-19
      • 2020-11-17
      • 2017-11-11
      • 2020-12-25
      • 2011-08-19
      • 2014-11-11
      • 2021-07-23
      • 1970-01-01
      相关资源
      最近更新 更多