运行结果:
总结:
1、for、 forEach、 map 循环效率依次递增;
2、使用数据 filter 效率最高;
3、二分法收到随机数波动影响,偶尔会超过filter 过滤;
代码如下:
* 生成单个正负整数
* @returns
*/
const makeOneRandomNum = () => {
const random = Math.random();
const plusOrMinus = random < 0.5 ? -random : random;
return parseInt(plusOrMinus * 10000);
}
/**
* 生成任意多个随机正负整数
* @param {*} count
* @returns
*/
const makeAnyRandomNum = (count = 10) => {
const list = [];
for (let i = 0; i < count; i++) {
list.push(makeOneRandomNum());
}
return list;
}
/**
* 普通for循环遍历去除
* @param {*} numbers
*/
const removeMinusNumbers1 = (numbers) => {
const numbersCopy = [...numbers];
for (let i = 0; i < numbers.length; i++) {
if (numbers[i] < 0) {
const index = numbersCopy.findIndex(d => d === numbers[i])
numbersCopy.splice(index, 1)
}
}
return numbersCopy
}
/**
* 普通forEach循环遍历去除
* @param {*} numbers
*/
const removeMinusNumbers2 = (numbers) => {
const numbersCopy = [...numbers];
numbers.forEach(item => {
if (item < 0) {
const index = numbersCopy.findIndex(d => d === item)
numbersCopy.splice(index, 1)
}
})
return numbersCopy;
}
/**
* 普通map循环遍历去除
* @param {*} numbers
*/
const removeMinusNumbers3 = (numbers) => {
const numbersCopy = [...numbers];
numbers.map(item => {
if (item < 0) {
const index = numbersCopy.findIndex(d => d === item)
numbersCopy.splice(index, 1)
}
})
return numbersCopy;
}
/**
* filter过滤去除
* @param {*} numbers
*/
const removeMinusNumbers4 = (numbers) => {
return numbers.filter(item => item > 0);
}
/**
* 排序二分法 去除
* @param {*} numbers
*/
const removeMinusNumbers5 = (numbers) => {
// 排序后负数在前面 [-99, -45, -3, 0, 1, 44]
const sortList = numbers.sort();
// 取数组中间index
let middleIndex = Math.floor(sortList.length / 2)
if (sortList[middleIndex] > 0) {
// middleIndex 左侧还有正数, 需要 (middleIndex --) 向左找到正负分界点
while (sortList[middleIndex] > 0) {
middleIndex --;
}
} else {
// middleIndex 右侧还有负数, 需要( middleIndex ++ ) 向右找到正负分界点
while (sortList[middleIndex] < 0) {
middleIndex ++;
}
middleIndex -= 1
}
return sortList.slice(middleIndex+1)
}
const main = () => {
console.time('生成100w正负随机整数耗时');
const randomNumList = makeAnyRandomNum(1000000);
console.timeEnd('生成100w正负随机整数耗时');
console.log('------------------------------------------------')
console.time('去除负数---for循环---耗时');
const result1 = removeMinusNumbers1(randomNumList)
console.timeEnd('去除负数---for循环---耗时');
console.log('------------------------------------------------')
console.time('去除负数---forEach---耗时');
const result2 = removeMinusNumbers2(randomNumList)
console.timeEnd('去除负数---forEach---耗时');
console.log('------------------------------------------------')
console.time('去除负数---map---耗时');
const result3 = removeMinusNumbers3(randomNumList)
console.timeEnd('去除负数---map---耗时');
console.log('------------------------------------------------')
console.time('去除负数---filter---耗时');
const result4 = removeMinusNumbers4(randomNumList)
console.timeEnd('去除负数---filter---耗时');
console.log('------------------------------------------------')
console.time('去除负数---排序二分法---耗时');
const result7 = removeMinusNumbers5(randomNumList)
console.timeEnd('去除负数---排序二分法---耗时');
console.log('------------------------------------------------')
// console.log('result1:', result1);
// console.log('result2:', result2);
// console.log('result3:', result3);
// console.log('result4:', result4);
// console.log('result5:', result5);
}
main();