本文已参与「新人创作礼」活动,一起开启掘金创作之路。
手动实现数组的一些方法,可以更好的帮助我们理解这些方法的用途
every( )
<script>
Array.prototype.myEvery = function (fn) {
let f = true
for (let i = 0; i < this.length; i++) {
let f = fn(this[i])
if (!f) {
//只要有一个不符合,立马返回false
return false
}
}
return f
}
var arr = [11, 33, 55, 21, 35, 12]
let res = arr.myEvery(function (item) {
return item > 10
})
console.log(res) //true
</script>
filter( )
<script>
Array.prototype.myFilter = function (fn) {
var newArray = []
for (var i = 0; i < this.length; i++) {
var f = fn(this[i])
if (f) {
newArray.push(this[i])
}
}
return newArray
}
var array = [63, 75, 56, 89, 53]
var arr = array.myFilter(function (item) {
return item > 70
})
console.log(arr) //[75, 89]
</script>
find( )
<script>
Array.prototype.myFind = function (fn) {
for (let i = 0; i < this.length; i++) {
//this指向调用者(数组)
var f = fn(this[i])
if (f) {
//如果经过fn处理后的f不为空
return this[i] //则返回对应的数组元素
}
}
}
var arr = [1, 3, 6, 9, 12]
var result = arr.myFind(function (item) {
return item > 6
})
console.log(result) //9
</script>
map( )
<script>
Array.prototype.myMap = function (fn) {
let newArray = []
for (let i = 0; i < this.length; i++) {
let f = fn(this[i], i, this)
newArray.push(f)
}
return newArray
}
var arr = [1, 3, 6, 90, 22]
var res = arr.myMap(function (element, index, array) {
console.log(index)
return element + 1
})
console.log(res)
//0
//1
//2
//3
//4
//[2, 4, 7, 91, 23]
</script>
reduce( )
<script>
Array.prototype.myReduce = function (fn, initalValue) {
//如果没有传递initialValue,我们将使用数组的第一项作为initialValue的值
let hasInitalValue = initalValue !== undefined
let value = hasInitalValue ? initalValue : this[0]
////如果没有传递initialValue,则索引从1开始,否则从0开始
for (let i = hasInitalValue ? 0 : 1; i < this.length; i++) {
value = fn(value, this[i], i, this)
}
return value
}
var arr = [1, 2, 3, 4, 5, 6]
var sum = arr.myReduce(function (accumulator, currentValue) {
return accumulator + currentValue
}, 0)
console.log(sum) //21
</script>
some( )
<script>
//some
// `some()` 方法让数组中的每一个元素执行一次回调函数,
// 在该回调函数中执行一些操作,只要有一个操作结果为真,就会返回true。
// 不会在对后面的元素进行判断,否则返回false。
Array.prototype.mySome = function (fn) {
for (let i = 0; i < this.length; i++) {
let f = fn(this[i])
if (f) {
return f
}
}
return false
}
let array = [1, 3, 5, 7, 90]
let res = array.mySome(function (item) {
return item > 10
})
console.log(res) //true
</script>
数组去重
<script>
var arr = [1, 2, 3, 4, 5, 5, 6, 7, 7]
//使用数组去重
function fn1(array) {
var newArray = []
for (let i = 0; i < array.length; i++) {
if (newArray.indexOf(array[i]) === -1) {
newArray.push(array[i])
}
}
return newArray
}
console.log(fn1(arr)) //[1, 2, 3, 4, 5, 6, 7]
//使用键值对去重
function fn2(array) {
let obj = {},
result = [],
val
for (let i = 0; i < array.length; i++) {
val = array[i]
if (!obj[val]) {
obj[val] = true
result.push(val)
}
}
return result
}
var arr2 = [1, 2, 3, 4, 5, 5, 6, '6']
console.log(fn2(arr2)) //[1, 2, 3, 4, 5, 6]
//使用键值对去重改进
function fn3(array) {
var obj = {},
result = [],
val,
type
for (var i = 0; i < array.length; i++) {
val = array[i]
type = typeof val
if (!obj[val]) {
//判断元素存在不存在,如果不存在
obj[val] = [type] //把类型作为key的value
result.push(val)
} else if (obj[val].indexOf(type) < 0) {
//如果元素存在,obj[val]寸的是数组,数组中是对应的类型
//看看有没有type这个类型,小于0说明没有用这个类型,新类型同样要push
obj[val].push(type)
result.push(val)
}
}
return result
}
var arr = [1, 2, 3, 4, 5, 5, 6, '6']
console.log(fn3(arr))
//利用set去重
function fn4(arr) {
return Array.from(new Set(arr))
}
var arr = [1, 2, 3, 4, 5, 5, 6, '6']
console.log(fn4(arr))
</script>
数组中出现最多的元素
function fn(arr) {
var result = {}
var maxNum = 0
var maxElement = null
for (var i = 0; i < arr.length; i++) {
var val = arr[i]
result[val] === undefined ? (result[val] = 1) : result[val]++
if (result[val] > maxNum) {
maxNum = result[val]
maxElement = val
}
}
return '出现最多的是' + maxElement + ',一共出现了' + maxNum + '次'
}
var array = [1, 2, 3, 3, 3, 6, 6, 6, 6, 6, 7, 8, 9]
console.log(fn(array)) //出现最多的是6,一共出现了5次