Array原生方法实现

73 阅读1分钟
function map(arr, cb) {
	let ret = []
	for (let i = 0; i < arr.length; i++) ret.push(cb(arr[i], i, arr))
	return ret
}

function forEach(arr, cb) {
	for (let i = 0; i < arr.length; i++) cb(arr[i], i, arr)
}

function filter(arr, cb) {
	let ret = []
	for (let i = 0; i < arr.length; i++) cb(arr[i], i, arr) && ret.push(arr[i])
	return ret
}

function indexOf(arr, item) {
	for (let i = 0; i < arr.length; i++) if (arr[i] === item) return i
	return -1
}

function includes(arr, item) {
	for (let _item of arr) if (_item === item) return true
	return false
}

function find(arr, cb) {
	for (let i = 0; i < arr.length; i++) if (cb(arr[i], i, arr)) return arr[i]
	return undefined
}

function reduce(arr, cb, preNum) {
	// arr.reduce((pre,cur)=>{ ... }, preNum)
	let ret = undefined
	let pre = preNum !== undefined ? preNum : arr[0]
	let cur = undefined

	for (let i = preNum !== undefined ? 0 : 1; i < arr.length; i++) {
     cur = arr[i]
     ret = cb(pre, cur)
     pre = ret
	}
	return ret
}

function concat(arr, ..._arr) {
	// 考虑到有两种情况: arr.concat([1,2,3])和arr.concat(1,2,3)
	return [...arr, ..._arr]
}

function push(arr, item) {
	arr.length++
        
	arr[arr.length - 1] = item
}

function unshift(arr, item) {
	arr.length++
        
	for (let i = arr.length - 1; i > 0; i--) [arr[i], arr[i - 1]] = [arr[i - 1], arr[i]]
	arr[0] = item
}

function pop(arr) {
	if (!arr.length) return

	let ret = arr[arr.length - 1]
	arr.length--
	return ret
}

function shift(arr) {
	if (!arr.length) return

	let ret = arr[0]
	for (let i = 0; i < arr.length - 1; i++) [arr[i], arr[i + 1]] = [arr[i + 1], arr[i]]
	arr.length--
	return ret
}

待更新