代码之家  ›  专栏  ›  技术社区  ›  Sreekanth Reddy

javascript中按不同元素排序

  •  1
  • Sreekanth Reddy  · 技术社区  · 6 年前

    我有很多元素

    输入

    {
           "a":[1,2,3],
           "b":[4,5,6],
           "c":[7,8,9]
    };
    

    我想从每个键中逐个获取元素。

    预期产量:

    [1,4,7,2,5,8,3,6,9]
    

    我尝试了以下几个不同的例子,但都失败了:

    let obj = {
       "a":[1,2,3],
       "b":[4,5,6],
       "c":[7,8,9]
    };
    let arr = [];
    
    for(let i in obj){
       arr.push(obj[i]);
    }
    
    let res = [];
    for(let i=0;i<arr.length;i++){
       for(let j=0;j<arr[0].length;j++){
         res.push(arr[j][i]);
       }
    }
    console.log(res);
    

    以上代码在以下示例中失败:

    {
           "a":[1,2,3]
    };
    

    错误:找不到未定义的0。

    {
    "a": [1,2,3],
    "b": [4,5,6,7]
    }
    

    输出中缺少7。

    以上问题的最佳解决办法是什么?

    2 回复  |  直到 6 年前
        1
  •  1
  •   Eddie    6 年前

    您可以使用 Math.max map 每个数组。

    let obj = {
      "a": [1, 2, 3],
      "b": [4, 5, 6, 7]
    }
    
    //Convert the object into multi dimentional array
    let arr = Object.values(obj);
    let res = [];
    
    
    for (i = 0; i < Math.max(...arr.map(o => o.length)); i++) {  //Loop from 0 to the legnth of the longest array
      for (x = 0; x < arr.length; x++) {                         //Loop each array
        if (arr[x][i]) res.push(arr[x][i]);                      //If element exist, push the array
      }
    }
    
    console.log(res);
        2
  •  1
  •   Vignesh Raja    6 年前

    这将是另一个简单的方法。

    var arr = {
           "a":[1,2,3],
           "b":[4,5,6],
           "c":[7,8,9]
    };
    
    var values = Object.values(arr); //Using this will modify the original object during the process
    
    //In case, original object should not be modified during the process use the following
    //var values = Object.values(arr).map(function(elem){return elem.slice();});
    
    var result = [];
    
    while(values.length)
    {
        values = values.filter(function(arr,index){ return arr.length; }); //Remove the empty arrays
        result = result.concat(values.map(function(elem){ return elem.shift(); })); //Get the first element of all arrays
    }
    
    console.log(result);