简体   繁体   English

如何在 JavaScript 中动态填充多维数组?

[英]How to dynamically populate a multidimensional array in JavaScript?

I have an object that I get from a URL request:我有一个从 URL 请求中获得的 object:

var data = {
    "DataSet": {
      "Series": [
     {
      "@FREQ": "A",
      "@REF_AREA": "BF",
      "@INDICATOR": "NGDP_R_PC_PP_PT",
      "@UNIT_MULT": "0",
      "@TIME_FORMAT": "P1Y",
      "Obs": [
        {
          "@TIME_PERIOD": "2018",
          "@OBS_VALUE": "6"
        },
        {
          "@TIME_PERIOD": "2019",
          "@OBS_VALUE": "5"
        },
        {
          "@TIME_PERIOD": "2020",
          "@OBS_VALUE": "1"
        },
        {
          "@TIME_PERIOD": "2021",
          "@OBS_VALUE": "5"
        }
      ]
    },
    {
      "@FREQ": "A",
      "@REF_AREA": "CI",
      "@INDICATOR": "NGDP_R_PC_PP_PT",
      "@UNIT_MULT": "0",
      "@TIME_FORMAT": "P1Y",
      "Obs": [
        {
          "@TIME_PERIOD": "2018",
          "@OBS_VALUE": "6"
        },
        {
          "@TIME_PERIOD": "2019",
          "@OBS_VALUE": "6"
        },
        {
          "@TIME_PERIOD": "2020",
          "@OBS_VALUE": "2"
        },
        {
          "@TIME_PERIOD": "2021",
          "@OBS_VALUE": "8"
        }
      ]
    }
  ]
}

} And I want an array that looks like this, each of the years and values from each 'Obs' array in its own array:我想要一个看起来像这样的数组,每个“Obs”数组中的每个年份和值都在它自己的数组中:

var dataSet = [
[["2018","6"],["2019","5"],["2020","1"],["2021","5"]],
[["2018","6"],["2019","6"],["2020","2"],["2021","8"]]
]

I have tried this:我试过这个:

let dataO = []  
var dataSet = data.Series.map((x,index) => {                  
  dataO.push(x.Obs.map(i=>i['@TIME_PERIOD']))
  dataO.push(x.Obs.map(r=>r['@OBS_VALUE']))
  return dataO
})

But I get an array with 2 elements, each containing all of the data from the object.但是我得到了一个包含 2 个元素的数组,每个元素都包含来自 object 的所有数据。 I can't see where I am going wrong.我看不出哪里出错了。 Any help is appreciated.任何帮助表示赞赏。 Thanks!谢谢!

You can use flatMap :您可以使用flatMap

data.DataSet.Series
    .flatMap(x => x.Obs)
    .map(x => [x["@TIME_PERIOD"], x["@OBS_VALUE"]])

Simple double loop:简单的双循环:

var dataSet = [];
data.DataSet.Series.map((x) => {
      var periods = [];
      x.Obs.map((y) => {
          periods.push([y['@TIME_PERIOD'], y['@OBS_VALUE']]);
      }); 

      dataSet.push(periods);
});

Testable below:可测试如下:

 var data = { "DataSet": { "Series": [{ "@FREQ": "A", "@REF_AREA": "BF", "@INDICATOR": "NGDP_R_PC_PP_PT", "@UNIT_MULT": "0", "@TIME_FORMAT": "P1Y", "Obs": [{ "@TIME_PERIOD": "2018", "@OBS_VALUE": "6" }, { "@TIME_PERIOD": "2019", "@OBS_VALUE": "5" }, { "@TIME_PERIOD": "2020", "@OBS_VALUE": "1" }, { "@TIME_PERIOD": "2021", "@OBS_VALUE": "5" } ] }, { "@FREQ": "A", "@REF_AREA": "CI", "@INDICATOR": "NGDP_R_PC_PP_PT", "@UNIT_MULT": "0", "@TIME_FORMAT": "P1Y", "Obs": [{ "@TIME_PERIOD": "2018", "@OBS_VALUE": "6" }, { "@TIME_PERIOD": "2019", "@OBS_VALUE": "6" }, { "@TIME_PERIOD": "2020", "@OBS_VALUE": "2" }, { "@TIME_PERIOD": "2021", "@OBS_VALUE": "8" } ] } ] } }; var dataSet = []; data.DataSet.Series.map((x) => { var periods = []; x.Obs.map((y) => { periods.push([y['@TIME_PERIOD'], y['@OBS_VALUE']]); }); dataSet.push(periods); }); console.log(dataSet);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM