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


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

 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>

數組知識參考地址:

數組參考


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM