【问题标题】:how to convert multidimention array to arr in object如何将多维数组转换为对象中的arr
【发布时间】:2019-04-13 17:13:52
【问题描述】:

你能解释一下如何将这个二维数组转换为数组并且数组中有对象的逻辑吗,这是输入:

const arr = [
["Tony", "a", "b"],
["Sara", "c", "z"]
           ];

如何将它们转换为:

obj = [
{
 name:"Tony", 
 first:"a", 
 second:"b"
},
{
 name:"Sara", 
 first:"c", 
 second:"z"
}
   ]

我们应该临时创建 2 个对象吗?将它们放入数组中, 以及如何循环?我们可以只使用一次性循环吗? 以及如果该 2d 数组长度与第一个或第二个上的 2d 不同,
我很想知道方法,如果你不介意的话,请解释一下, 我喜欢你们都不要为此使用 ES6 :),所以我知道逻辑

【问题讨论】:

  • 原来你甚至不想使用 ES5,比如.map!?

标签: javascript arrays object for-loop multidimensional-array


【解决方案1】:

使用Array.map()。在地图的回调中,使用array destructuring 将值提取到变量中,然后使用shorthand property names 创建对象:

const arr = [["Tony", "a", "b"], ["Sara", "c", "z"]];

const result = arr.map(([name, first, second]) => ({
  name,
  first,
  second
}));

console.log(result);

如果您不想使用Array.map(),您可以使用for...of 循环构建一个:

const map = (arr, cb) => {
  const r = [];
  
  for(const item of arr) {
    r.push(cb(item));
  }
  
  return r;
};

const arr = [["Tony", "a", "b"], ["Sara", "c", "z"]];

const result = map(arr, ([name, first, second]) => ({
  name,
  first,
  second
}));

console.log(result);

【讨论】:

  • 如果我们不使用地图呢? @ori
  • 地图就像魔法一样,我想通过逻辑和旧式方法学习,:D,
  • 地图一点也不神奇。您可以使用for...loop - awanderingreader.com/… 轻松构建地图
  • @ZrClassic - 我添加了一个使用 for...of 的无魔法地图示例。
【解决方案2】:

您可以将.map() 与一些数组解构一起使用:

const arr = [
  ["Tony", "a", "b"],
  ["Sara", "c", "z"]
];

const result = arr.map(([name, first, second]) => ({name, first, second}));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

或者,您可以使用简单的 for 循环:

const arr = [
  ["Tony", "a", "b"],
  ["Sara", "c", "z"]
];

const result = [];

for(var i = 0; i < arr.length; i++) {
  result.push({
    name: arr[i][0],
    first: arr[i][1],
    second: arr[i][2]
  });
}

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

    【解决方案3】:
    var arr = [["Tony", "a", "b"], ["Sara", "c", "z"]];
    
    function parseData(input){ 
        var output = [];
        for(var i = 0; i< input.length ; i++){
            output.push({name:input[i][0],first:input[i][1],second:input[i][2]})
        }
        return output;
    }
    console.log(parseData(arr));
    

    编辑 - 解释

    由于输入结构为 2D 数组,内部数组的固定长度为 3,外部数组为非负数 ( >= 0 )。使用for循环遍历外部数组,使用索引号遍历内部数组,并将结果存储在output数组中。

    JsFiddle 演示 - https://jsfiddle.net/53umf8rv/

    【讨论】:

    • 由于您的答案可能是一个很好的答案,它仍然需要更多关于更改及其工作原理的解释。
    • @TânNguyễn 根据要求添加说明。
    【解决方案4】:

    没有地图:

    const arr = [
    ["Tony", "a", "b"],
    ["Sara", "c", "z"]
               ];
    
    obj=[]; 
    for(innerArr of arr)
    {
    obj.push({"name":innerArr[0],"first":innerArr[1],"second":innerArr[2]});
    }
    
    console.log(obj);
    

    【讨论】:

      【解决方案5】:

      不使用高阶函数,您可以使用for of 循环来实现:

      const arr = [
        ["Tony", "a", "b"],
        ["Sara", "c", "z"]
      ];
      
      let obj_arr = [];
      
      for(inner_arr of arr) {
        obj_arr = [...obj_arr, {name: inner_arr[0], first: inner_arr[1], second: inner_arr[2]}];
      }
      
      console.log(obj_arr);

      【讨论】:

        【解决方案6】:

        您可以使用外部for ... of statement,它迭代数组的项目并使用带有索引变量的经典for statement 迭代内部数组,该索引变量也用于获取相应的键值。

        对于每个内部迭代,为临时对象获取一个新属性并分配一个值。在内部迭代结束时,将临时对象推送到结果集。

        function convert(array, keys) {
            var result = [],
                items,
                i,
                temp;
            
            for (items of array) {
                temp = {};
                for (i = 0; i < items.length; i++) {
                    temp[keys[i]] = items[i];
                }
                result.push(temp);
            }
            
            return result;
        }
        
        console.log(convert([["Tony", "a", "b"], ["Sara", "c", "z"]], ["name", "first", "second"]));

        【讨论】:

          猜你喜欢
          • 2021-12-28
          • 2016-11-28
          • 2012-11-14
          • 2014-05-25
          • 1970-01-01
          • 1970-01-01
          • 2012-02-28
          • 2013-07-03
          相关资源
          最近更新 更多