去重操做
第一種方式, ES 6 引入的新書據結構 Set 自己就是沒有重複數據的, 可使用這個數據結構來轉化數組.
時間複雜度 O(n)javascript
1 2 3 4 5 6
|
const target = []; const sourceArray = [1,1,2,3,4,2,3,4,5,6,5,7]; new Set(sourceArray).forEach(current => { target.push(current); }); console.log(target); |
第二種方式, 使用 indexOf 或者 lastIndexOf 兩個方法, 判斷循環位置到整個數組的開始或者結束, 是否是還存在相同值
時間複雜度 O(n), 可能比上面的循環要長, 少一步 Set 的構建java
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
const source = [1,1,2,3,4,2,3,4,5,6,7,6,5,4];
function noRepeat(array) { let tempArr = []; for(let i = array.length - 1; i >= 0; i -= 1) { let firstIndex = array.indexOf(array[i]); if(firstIndex === i) { tempArr.unshift(array[i]); } } return tempArr; }
console.log(noRepeat(source)); |
過濾 null 和 undefined
1 2 3 4
|
const source = [1,2,3, null, undefined, 4, null]; const target = source.filter(current => { return current !== null && current !== undefined; })
|
取得每一個元素的指定屬性
1 2 3 4 5 6 7 8 9
|
const lists = [{ name: 'a', value: 1}, { name: 'b', value: 2 }, { name: 'c', value: 3}]; function pluck(args, current) { let tempArr = []; for(let i in args) { tempArr.push(args[i][current]) } return tempArr; } pluck(lists, name)
|
取最大值最小值
1 2
|
Math.max.apply(null, [0,1,2,3,4,5,-1,-2]); |
這個方法會判斷傳入參數是否是一個數組, 這是一個瀏覽器的原生方法, 須要 IE 9+ 的支持數組
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
|
Array.of 建立方法
使用參數建立數組, 和 Array() 不同的是, 若是傳入的參數是一個數值, 依然會被看成數組元素, 而不是數組長度瀏覽器
對值操做的方法
這一部分的方法基本不會對原數組產生影響ruby
這個方法用來合併數組, 並且是生成一個新數組返回, 不會影響到原來的數組, 因此能夠用來作數組平坦話操做和克隆操做bash
有一個地方須要注意, 數組是一個引用類型的值, 若是存在嵌套數組的狀況, 被嵌套數組的引用會被合併到返回數組當中, 這就會對原數組產生影響了markdown
1 2 3 4 5 6
|
let a = [[1]]; let b = [2, [3]]; let c = a.concat(b); |
slice
方法返回一個從開始到結束(不包括結束)選擇的數組的一部分淺拷貝到一個新數組對象。且原始數組不會被修改.數據結構
這個方法常常用來把類數組元素轉化爲數組app
1
|
[].slice.call({ 0: 0, 1: 1, 2: 2, length: 3}); |
使用數組內部值, 返回一個對原數組的修改結果, 一樣不會修改原數組dom
filter
從原數組進行篩選, 選出符合條件的值建立新數組
1 2
|
'1234567'.split('').filter(value => value > 3); |
join
把數組當中的全部元素拼接成一個字符串.
這個方法能夠看做是和 String.prototype.split 互爲反操做
1 2
|
[ '1', '2', '3', '4', '5' ].join('_'); |
map
收集操做, 數組當中的值會一次被傳入一個函數當中執行, 全部的結果組合成新數組返回.
1
|
[1,2,3].map(value => value**2); |
reduce, reduceRight
歸化操做, 把數組中的全部元素合併成爲一個值.
reduce 的順序是從左向右, reduceRight 的順序是從右開始的
1 2 3
|
const arr = 'abcde'.split(''); arr.reduce((prevent, current) => prevent + current); |
對原數組修改的方法
fill 填充數組
使用傳入的參數填充數組, 傳入的參數會被看成是固定值來處理, 若是是一個函數, 會首先計算出函數取值, 而後再填充到須要做修改的位置.
這個函數還能夠按照位置進行填充
1 2
|
Array(3).fill(Math.random() * 100 >> 2); |
push, pop
push, 在數組的最右面增長新值, 函數的返回值爲新值.
pop, 在數組的最右面刪除值, 被刪除的值會做爲返回值返回.
shift, unshift
shift, 刪除數組的第一個元素, 而且返回這個元素的值
unshift, 在數組的第一個位置增長一個元素
1 2 3 4 5 6
|
let a = '12345'.split(''); a; |
reverse
這個方法會把原數組當中的位置的顛倒.
數組和字符串能夠相互轉換, 這個方法還能夠用來顛倒字符串.
sort
這個方法會對原數組進行排序, 默認根據 unicode 碼點進行排序, 能夠傳入比較參數進行 DIY
1 2 3
|
[1,2,3,11,22,33].sort(); |
splice
經過刪除, 或者增長一個元素的方式, 來變動數組內容
1 2 3 4 5
|
let a = '12345'.split(''); a.splice(2, 2, 0); |
條件判斷方法
every
須要全部數組中的元素都知足條件, 纔會返回 true.
1 2
|
[1, 2, 3].every(value => value > 0); |
some
只要有一個元素知足條件, 就會返回 true.
1
|
[1, 2, 3].some(value => value > 2); |
includes
判斷一個數組是否包含指定值
查找方法
find 查找值, 函數參數
返回第一個知足條件的值, 沒有就返回 undefined
1
|
[1,2,3,4,5].find(value => value > 3); |
findIndex 查找索引
返回第一個知足條件的索引, 不然返回 -1
1
|
[1,2,3,4,5].findIndex(value => value > 3); |
indexOf 查找索引, 值參數
lastIndexOf 查找最後一個索引
1 2
|
[1, 2, 3, 1, 2, 3].lastIndexOf(2); |
遍歷方法
forEach 循環整個數組
對數組中的每一個元素執行一次傳入函數, 不能夠中斷
1 2 3
|
let count = ''; 'abcde'.split('').forEach(value => count += value); count; |
返回一個數組的迭代器, 包含元素的索引和值
1 2 3 4 5 6
|
let a = 'abcde'.split(''); |
key 返回索引的迭代方法
返回值只包含索引
1 2 3 4
|
let a = 'abcde'.split(''); let k = a.keys(); |