1、不改變原數組,返回新數組(字符串)javascript
一、concat() 鏈接兩個或者多個數組,兩邊的原始數組都不會變化,返回的是被鏈接數組的一個副本。html
二、join() 把數組中全部的元素放入到一個字符串中,返回字符串java
var a = [1,2,3]; a.join([4,5,6]); // "14,5,624,5,63" a.join('sau'); // "1sau2sau3"
三、slice() 從開始到結束(不包括結束)選擇數組的一部分淺拷貝到一個新數組算法
var a = [1,2,3,4,5]; a.slice(0,0); //[] a.slice(0,1); //[1] a.slice(2,4); //[3,4] a.slice(0,5); //[1,2,3,4,5] a.slice(10,1); //[] a.slice(4); //[5]
四、map() 建立一個新的數組並返回,其中新數組的每個元素由調用原始數組中的每個元素執行提供的函數得來,原數組不變數組
五、every() 對數組中的每個元素都執行一次指定的回調函數,直到回調函數返回false,此時every()返回false並再也不繼續執行,若是回調函數都對每個元素都返回true,那麼every()返回true。函數
六、some() 對數組中的每個元素都執行一次指定的回調函數,直到回調函數返回true,此時some()返回true並再也不執行。若是回調函數對每個元素都返回false,那麼some()將返回false。測試
七、filter() 建立一個新數組,其中包含經過所提供函數實現的測試的全部元素。優化
2、改變原數組ui
一、forEach() 針對每個元素執行提供的函數。會修改原來的數組,不會返回執行結果,返回undefined。spa
二、pop() 刪除數組最後一個元素,返回被刪除的元素的值,若是數組爲空,則不改變數組,返回undefined。
三、push() 向數組末尾添加一個或多個元素,返回改變後數組的長度。
四、reverse() 顛倒數組中元素的位置,返回該數組的引用。
五、shift() 從數組中刪除第一個元素,改變原數組,並返回該元素的值。
六、unshift() 將一個或者多個元素添加到數組的開頭,並返回新數組的長度。
七、sort() 對數組的元素進行排序,返回數組。排序不必定是穩定的。默認排序順序是根據字符串unicode碼點。
八、splice() 向數組中添加/刪除元素,而後返回被刪除的新數組()。
var a = [1,2,3,4,5]; a.splice(0,1); //刪除從0位置開始的1個 返回[1] a爲[2,3,4,5] a.splice(1,0,99) //在1的位置插入99 [2,99,3,4,5] a.splice(1,1,88) //99替換爲88 [2,88,3,4,5]
3、遍歷方法
一、獲取屬性名:for...in 和object.key()的區別
答:一、for in 遍歷對象能夠枚舉的屬性名列表,包括[[prototype]]原型鏈;
二、Object.keys() 只查找屬性名是否在對象中,返回一個數組,包含全部能夠枚舉的屬性名;
三、Object.getOwnPropertyNames()只查找屬性名是否在對象中,返回一個數組,包含全部的屬性名,不管是否可枚舉。
二、獲取屬性值: for... of 和object.values()
for of 語句:遍歷可迭代對象的可枚舉屬性值列表,包括[[propertype]]原型鏈;
object.values() :返回一個給定對象自身的全部可枚舉屬性的值,不包括原型鏈。
4、ES6語法Map鍵值對轉化爲數組
new Map建立一個map
// new Map建立一個map let map = new Map([[1,"one"], [2,"two"], [3,"three"]]); map.set(4, "four"); // 獲取全部鍵值對 console.log("獲取key") console.log([...map.keys()]) // 輸出[1, 2, 3, 4] console.log("獲取value") console.log([...map.values()]) // 輸出[one, two, three, four] console.log("獲取map數組") console.log([...map]) // 輸出[[1, "one"], [2, "two"], [3, "three"], [4, "four"]]
5、兩個升序的數組合併成一個升序數組
一、時間複雜度O(M+N),空間複雜度O(M+N)
function merge(left, right){ let result = [], il = 0, ir = 0; while (il < left.length && ir < right.length) { result.push(left[il] < right[ir] ? left[il++] : right[ir++]); console.log(result);}
return result.concat(left.slice(il)).concat(right.slice(ir)); }
二、時間複雜度O(M+N),空間複雜度O(1)
// m, n 是數組長度 function merge(left, m, right, n) { var i = m - 1, j = n - 1, writeIdx = m + n - 1; while (i >= 0 && j >= 0) left[writeIdx--] = left[i] > right[j]? left[i--] : right[j--]; while (j >= 0) left[writeIdx--] = right[j--]; return left; }
6、數組重複問題
(一)數組去重
一、reduce方法
const distinct = arr => arr.sort().reduce( (init, current) => { if (init.length === 0 || init[init.length - 1] !== current) { init.push( current ); } return init; }, []); let arr = [1,2,1,2,3,5,4,5,3,4,4,4,4]; distinct(arr); // [1, 2, 3, 4, 5]
二、filter方法
const distinct = arr => arr.filter( (element, index, self) => { return self.indexOf( element ) === index; }); let arr = [1,2,1,2,3,5,4,5,3,4,4,4,4]; distinct(arr); // [1, 2, 3, 5, 4]
(二)排序數組去重
/** * @param {number[]} nums * @return {number} */ var removeDuplicates = function(nums) { if(!nums || nums.length == 0) return 0; let len = 0; for(let i = 1; i < nums.length; i++) { if (nums[len] != nums[i]) { nums[++ len] = nums[i]; } } return len + 1; };
(三)判斷數組是否存在重複
/** * @param {number[]} nums * @return {boolean} */ var containsDuplicate = function(nums) { let hashMap = new Map(); for(let i = 0; i < nums.length; i++) { if( hashMap.has(nums[i]) ) { return true; } hashMap.set(nums[i], 1); } return false; };
7、兩個數組的交集
給定兩個數組,寫一個方法來計算它們的交集。
例如:
給定 nums1 = [1, 2, 2, 1], nums2 = [2, 2], 返回 [2, 2].
注意:一、出結果中每一個元素出現的次數,應與元素在兩個數組中出現的次數一致。二、
跟進:一、若是給定的數組已經排好序呢?你將如何優化你的算法?二、若是 nums1 的大小比 nums2 小不少,哪一種方法更優?三、若是nums2的元素存儲在磁盤上,內存是有限的,你不能一次加載全部的元素到內存中,你該怎麼辦?
解法:
/** * @param {number[]} nums1 * @param {number[]} nums2 * @return {number[]} */ var intersect = function(nums1, nums2) { var map1 = new Map(); var number = []; for(var i = 0; i < nums1.length; i++) { var map1Value = map1.get(nums1[i]); map1.set( nums1[i], ( map1Value ? map1Value : 0 ) + 1 ); } for(var i = 0; i < nums2.length; i++) { if( map1.has(nums2[i]) && map1.get(nums2[i]) != 0 ) { number.push(nums2[i]); map1.set( nums2[i], map1.get(nums2[i]) - 1 ); } } return number; };
8、找出一個數組中只出現一次的數字
給定一個非空整數數組,除了某個元素只出現一次之外,其他每一個元素均出現兩次。找出那個只出現了一次的元素。
/** * @param {number[]} nums * @return {number} */ var singleNumber = function(nums) { let number = 0; for(let i = 0; i < nums.length; i++) { number ^= nums[i]; } return number; };