【问题标题】:Convert nested array into array of objects problem将嵌套数组转换为对象数组问题
【发布时间】:2019-05-02 23:45:57
【问题描述】:

我正在尝试将此嵌套数组数据转换为对象数组。这是数据。

  const tableData = [
    ["first_name", "last_name", "city", "state"],
    ["June", "Gregory", "Hammond", "IN"],
    ["James", "Wynn", "Gary", "IN"],
    ["Craig", "Norman", "Schererville", "IN"]
  ]

这是输出应该是什么

[
  { first_name : "June", last_name : "Gregory", city: "Hammond", state : "IN" },
  { first_name : "James", last_name : "Wynn", city: "Gary", state : "IN" },
  { first_name : "Craig", last_name : "Norman", city: "Schererville", state : "IN" }
]

这是我的代码。

    function convertTable(table_data) {
var result = []
var key, value
for (var i=0; i<table_data.length; i++) {
  var employee = {}
  for (var j=0; j<table_data[i].length; j++) {
    key = table_data[i][j][0]
    value = table_data[i][j][1]
    employee[key] = value
   }
   result.push(employee)
  }
  return result
 }

  var input = [
    ["first_name", "last_name", "city", "state"],
    ["June", "Gregory", "Hammond", "IN"],
    ["James", "Wynn", "Gary", "IN"],
    ["Craig", "Norman", "Schererville", "IN"]
  ]

console.log(convertTable(input));

解决方案是打印出单词的首字母而不是整个单词。我很难理解为什么。我问是否有任何评论者可以逐行离开 cmets 以帮助我理解这个程序。我在研究类似问题的帮助下编写了它,但仍然很难理解。我一直在 w3schools、MDN 上阅读有关 Javascript 的内容,并在 Youtube 上观看有关解释的视频。任何其他帮助将不胜感激,谢谢。

【问题讨论】:

  • 请看一下这个:stackoverflow.com/help/someone-answers。如果答案对您有帮助,请遵循这些建议。请记住,人们会花时间和精力帮助您,并且会感谢您的一些反馈。那里有一些不错的答案...

标签: javascript arrays object javascript-objects


【解决方案1】:

试试这个,

你只是放错了一些索引,除了一切都很好。 只要与您的功能相匹配,您就可以轻松找到您错过的地方。

  const tableData = [
    ["first_name", "last_name", "city", "state"],
    ["June", "Gregory", "Hammond", "IN"],
    ["James", "Wynn", "Gary", "IN"],
    ["Craig", "Norman", "Schererville", "IN"]
  ]


    function convertTable(table_data) {
var result = []
var key, value
for (var i=1; i<table_data.length; i++) {
  var employee = {}
  for (var j=0; j<table_data[i].length; j++) {
    key = table_data[0][j]
    value = table_data[i][j]
    employee[key] = value
   }
   result.push(employee)
  }
  return result
 }

  var input = [
    ["first_name", "last_name", "city", "state"],
    ["June", "Gregory", "Hammond", "IN"],
    ["James", "Wynn", "Gary", "IN"],
    ["Craig", "Norman", "Schererville", "IN"]
  ]

console.log(convertTable(input));
  { first_name : "June", last_name : "Gregory", city: "Hammond", state : "IN" },
  { first_name : "James", last_name : "Wynn", city: "Gary", state : "IN" },
  { first_name : "Craig", last_name : "Norman", city: "Schererville", state : "IN" }
] */

【讨论】:

    【解决方案2】:

    首先,您将两个值都取为单个字符,这不是必需的,

    key = table_data[i][j][0]
    //                    ^^^
    value = table_data[i][j][1]
    //                      ^^^
    

    然后您需要进行两项更改,一项用于外部循环以省略键,而在内部使用第一行作为键。请在代码中查看 cmets。

    另一个变化是在函数顶部声明所有变量。

    function convertTable(table_data) {
        var result = [],
            key, value,
            employee,
            i, j;
    
        for (i = 1; i < table_data.length; i++) {        // start from index 1
            employee = {};
            for (j = 0; j < table_data[i].length; j++) {
                key = table_data[0][j];                  // take the value form index zero
                                                         // no following index for the letter
                value = table_data[i][j];                // no following index for the letter
                employee[key] = value;
            }
            result.push(employee);
        }
        return result;
    }
    
    var input = [["first_name", "last_name", "city", "state"], ["June", "Gregory", "Hammond", "IN"], ["James", "Wynn", "Gary", "IN"], ["Craig", "Norman", "Schererville", "IN"]]
    
    console.log(convertTable(input));
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    不同的方法

    function convertTable(table) {
        return table
            .slice(1)
            .map(a => Object.assign(...table[0].map((k, i) => ({ [k]: a[i] }))));
    }
    
    var input = [["first_name", "last_name", "city", "state"], ["June", "Gregory", "Hammond", "IN"], ["James", "Wynn", "Gary", "IN"], ["Craig", "Norman", "Schererville", "IN"]]
    
    console.log(convertTable(input));
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    【讨论】:

      【解决方案3】:

      这是使用Array.reduce的简洁版本:

      const data = [["first_name", "last_name", "city", "state"], ["June", "Gregory", "Hammond", "IN"], ["James", "Wynn", "Gary", "IN"], ["Craig", "Norman", "Schererville", "IN"]]
      
      const result = data.reduce((r,c,i,arr) => {
        if(i) r.push(c.reduce((a,b,j) => (a[arr[0][j]] = b, a), {}))
        return r
      }, [])
      console.log(result)

      这个想法是通过跳过第一行/标题行的数据,然后继续将来自内部 reduce 的组合对象推送到累加器,它只是用标题中的值(作为键)装饰和清空对象和当前数组(作为值)

      【讨论】:

      • –1,reduce 不够;)
      • :) 有没有“足够减少”之类的东西?
      【解决方案4】:

      您正在访问根数组上的 3-level 深层,因此您在 2-level 数组中索引字符串。

      使用这个:key = table_data[i][j][0],您正在访问索引i 上数组中j-placed 字符串的第一个字符。

      使用这个:value = table_data[i][j][1],您正在访问索引i 上数组内的j-placed 字符串的第二个字符。

      另外,您已经知道第一个数组是键(或标题),因此您不想循环它。检查下一个示例:

      function convertTable(table_data)
      {
          var result = [];
          var key, value;
          
          for (var i = 1; i < table_data.length; i++)
          {
              var employee = {};
      
              for (var j = 0; j < table_data[i].length; j++)
              {
                  key = table_data[0][j];
                  value = table_data[i][j];
                  employee[key] = value;
              }
      
              result.push(employee);
           }
           
           return result;
       }
      
        var input = [
          ["first_name", "last_name", "city", "state"],
          ["June", "Gregory", "Hammond", "IN"],
          ["James", "Wynn", "Gary", "IN"],
          ["Craig", "Norman", "Schererville", "IN"]
        ]
      
      console.log(convertTable(input));

      【讨论】:

        【解决方案5】:

        您的代码包含三个错误,可以按如下方式修复:

        1. i = 1 开始迭代您的外循环以跳过位于索引 0 处的标头。

        2. 使用tableData[0][j] 而不是tableData[i][j][0] 对标头数组进行索引,这是一维太多(访问字符)并且错误地包含行索引i

        3. 使用tableData[i][j] 而不是tableData[i][j][1] 对您的数据表进行索引,这会再次访问您的字符串中的字符。

        除此之外,我建议注意空格、分号和驼峰式大小写约定。这将使您的代码更易于理解和调试。

        把它放在一起产生:

        function convertTable(tableData) {
          var result = [];
          var key;
          var value;
          
          for (var i = 1; i < tableData.length; i++) { // start at 1 to skip headers
            var employee = {};
            
            for (var j = 0; j < tableData[i].length; j++) {
              key = tableData[0][j];   // remove character index and use [0][j]
              value = tableData[i][j]; // remove character index
              employee[key] = value;
            }
            
            result.push(employee);
          }
          
          return result;
        }
        
        var input = [
          ["first_name", "last_name", "city", "state"],
          ["June", "Gregory", "Hammond", "IN"],
          ["James", "Wynn", "Gary", "IN"],
          ["Craig", "Norman", "Schererville", "IN"]
        ];
        
        console.log(convertTable(input));

        除此之外,数组函数 mapreduce 执行 CSV 到对象的转换是一项很棒的任务。 shift() 弹出数组前面的标题,map 循环遍历行并将reduce 应用于每一行。 reduce 使用 ij 行/列索引构建一个对象,以与您的函数相同的方式引用 headers 数组。

        const tableData = [
          ["first_name", "last_name", "city", "state"],
          ["June", "Gregory", "Hammond", "IN"],
          ["James", "Wynn", "Gary", "IN"],
          ["Craig", "Norman", "Schererville", "IN"]
        ];
        
        const headers = tableData.shift();
        const result = tableData.map((e, i) => 
          e.reduce((a, f, j) => {
            a[headers[j]] = f;
            return a;
          }, {})
        );
        
        console.log(result);

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-03-26
          • 2019-01-31
          相关资源
          最近更新 更多