在開發過程中遇到一個比較ip大小的情況,並且遇到了把二維數組轉為一維數組的情況,翻下資料,做下總結。
方法一:轉字符串法
該例子中,tempArr是一個多維數組,使用join將其轉為字符串,在使用split方法轉換為一維數組。
缺點: 如果數組中的各個項是number,將不可避免的轉為字符串。
/** * 使用轉字符串法 */ let tempArr = [1,[2,3],[4,5,[6,7]]]; let result_str1 = tempArr.join(',').split(','); console.log(result_str1); // ["1", "2", "3", "4", "5", "6", "7"]
改進:
使用了map進行再次遍歷。
這種情況只適用於數組中各個項都是number類型或string類型的情況
// 可以使用循環改進 function unid(arr){ let result_str1 = arr.join(',').split(','); let result_number = result_str1.map(item=>{ return Number(item); }); return result_number; } console.log(unid(tempArr)); // [1, 2, 3, 4, 5, 6, 7]
方法二:使用數組的concat方法,以及apply
我們知道concat方法參數如果是一個數組,會把一個一維數組轉為單個的項和前面的數組鏈接起來,如果是多維數組,則保留多維數組里面的項。
看下面這個小例子:
// 數組的concat方法
let tempArr2 = ['3',4],
tempArr3 = ['3',4,[5,6]];
console.log([1,2].concat(tempArr2)); // [1, 2, "3", 4]
console.log([1,2,].concat(tempArr3)); // [1, 2, "3", 4, [5,6]]
所以使用concat方法只能把二維數組轉為一維數組
let tempArr4 = [[1,2],'3','4',[5,6],[7]]; console.log([].concat.apply([],tempArr4)); // [1, 2, "3", "4", 5, 6, 7]
方法三:使用遞歸
可以使用Object.prototype.toString.call()來判斷array的類型,也可以使用Array.isArray來判斷。
// 方法三:使用遞歸來實現多維數組轉為一維數組 let result = [], tempArr5 = ['1',2,[3,4,[5,6]],7]; function unid1(arr){ for(let item of arr){ if(Object.prototype.toString.call(item).slice(8, -1)==='Array'){ unid1(item); }else{ result.push(item); } } return result; } console.log(unid1(tempArr5)); // ["1", 2, 3, 4, 5, 6, 7]
三種方法有好有壞,還是需要根據實習情況來按需使用。