在日常工作中,我們需要根據後端傳回的資料結構組裝元件需要的資料,如下所示:給出如下一個對象,要求傳回對象中的數組的相對應的新的二位數組
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>
數組知識參考位址:
數組參考