天天看點

前端面試題---數組和對象的轉化

在日常工作中,我們需要根據後端傳回的資料結構組裝元件需要的資料,如下所示:給出如下一個對象,要求傳回對象中的數組的相對應的新的二位數組

1 <script>
 2       // 2019-3-4 面試題:數組和對象直接的轉化
 3       //  合并對象中的一維數組為二維數組,并且傳回新數組
 4       // 傳回前的對象
 5       let obj = {
 6         0: [44, 67, 96],
 7         1: [90, 43, 56],
 8         2: [56, 67, 33],
 9         3: [80, 96, 45]
10       };
11       // 傳回後的數組
12       let arr = [[44, 90, 56, 80], [67, 43, 67, 96], [96, 56, 33, 45]];
13 </script>      

第一種寫法:

1.先取出對象中的每一個屬性,然後再根據每一項的數組去循環,

2.建立空數組,儲存值,注意新的屬性需要判斷是否有數組存在

3.優化意見:如果數組長度不是很長,比如不超過200條,可以采用一下方法,如果太多,那麼我們需要先分組,再去傳回數組的資料,再去渲染我們的頁面,

理由:

1)減少資料量的傳輸,減少伺服器丢包的情況,

2)減少資料處理,可以快速渲染頁面,減少使用者登入的事件,白屏的出現等

1 <script>
 2     //  參考答案:
 3       /* 第一種寫法
 4        *  先周遊對象,再周遊對象中的數組取值
 5        *
 6        *
 7        */
 8       let data = {
 9         0: [44, 67, 96],
10         1: [90, 43, 56],
11         2: [56, 67, 33],
12         3: [80, 96, 45]
13       };
14       var arr = [];
15       //  周遊對象的每一個對象
16       for (var item in data) {
17         //  map取對象每一個total對應的值取指派
18         data[item].map((i, index) => {
19           if (!arr[index]) {
20             arr[index] = [];
21           }
22           arr[index].push(data[item][index]);
23         });
24       }
25       console.log(arr);
26 </script>      

第二種:es6文法實作

1.生成一個變量 const getResult();注意這裡的變量是函數新的傳回值,即 

Array.from()

 方法從一個類似數組或可疊代對象中建立一個新的數組執行個體。

2. 注意map 這裡不要寫花括弧{},不然會列印錯誤,因為寫{}就是一個函數體,需要return 一下傳回值

<script>
   /*
       *第二種寫法 arry.from 使用
       *
       */
      const getResult = obj =>
        obj[0].map((_, index) => 
          Array.from(Object.values(obj), x => x[index])
    );
      getResult(obj);
      console.log(getResult(obj));
</script>      

第二種方法的缺點:

1.es6支援性的考慮,相容未判斷,ie9以下不支援,ios8需要考慮

2.obj[0]不支援,不能下标不是0的對象,需要轉化處理

優化後的代碼:

function getArr(obj) {
        if (typeof obj != "object") {
          console.warn("參數不正确");
          return;
        }
        if (Array.from) {
          obj = Object.values(obj);
          const arr = obj[0].map((_, index) => Array.from(obj, a => a[index]));
          return arr;
        }
        var arr = [];
        //  周遊對象的每一個對象
        for (var item in obj) {
          //  map取對象每一個total對應的值取指派
          obj[item].map((i, index) => {
            if (!arr[index]) {
              arr[index] = [];
            }
            arr[index].push(obj[item][index]);
          });
        }
        return arr;
      }
      getArr(obj);      

總結:

實作代碼需求的代碼千萬種,隻有不斷優化,提高性能穩定和代碼複用性才好啊。

今日面試題:

<script>
     // 2019-3-5 今日面試題,數組去重
      let m = [1, 2, 2],
        n = [2, 3, 3];
      // 傳回 m 和n 的不重複的元素,并且按照從小到大排序
   //傳回後的結果
         
    const l =[1,2,3]      
</script>      

數組知識參考位址:

數組參考