js手写题——数组去重和数组排序

数组去重

set去重

let arr = ['a', 'b', 'c', 'c', 'd', 'd']
const newArr = [...new Set(arr)]

indexOf 去重

//数组去重
let arr = ['a', 'b', 'c', 'c', 'd', 'd']

//方式1
const newArr = arr.filter((item, index)=>{
  // console.log(arr.indexOf(item), index, item)
  return arr.indexOf(item) == index
})

//方法2
function quchong(arr){
  var s= []
  for (let i = 0; i < arr.length; i++) {
    if(s.indexOf(arr[i]) == -1){
      s.push(arr[i])
    }
  }
  return s
}
var arr = [1,1,2,3,4,2,'4',5]
var a = quchong(arr)
console.log(a) //[1, 2, 3, 4, "4", 5]

// includes方式
const result = []
for (const v of arr) {
  if(!result.includes(v)){
    result.push(v)
  }
}

数组对象去重
//方式1
const arr = [
  {'name': 'ti', 'id': 1},
  {'name': 'yu', 'id': 2},
  {'name': 'ti', 'id': 3},
  {'name': 'yu', 'id': 4},
]

const newArr = arr.filter((item, index)=>{
  let myArr =[]
  arr.forEach(el=>{
    myArr.push(el.name)
  })
  console.log(myArr)

  return myArr.indexOf(item.name) === index
})

//方式2
const list = [
  { id: 1, a: 1 },
  { id: 2, a: 2 },
  { id: 3, a: 3 },
  { id: 1, a: 4 },
];

const result = list.reduce((acc,cur)=>{
  const ids = acc.map(item => item.id)
  return ids.includes(cur.id)? acc: [...acc, cur]
},[])
数组排序

sort排序

//数字排序
const arr = [3,2,4,1,5]
arr.sort((a, b)=> a-b)
console.log(arr)//[1, 2, 3, 4, 5]

//字母排序
const arr = ['b','c','a','e', 'd']
arr.sort()
console.log(arr)//['a', 'b', 'c', 'd', 'e']

冒泡排序

/**

*2*,7,4,1=>
2,*7*,4,1=>
2,4,*7*,1=>
2,4,1,*7*   // 这样就找到了最大数
*2*,4,1,7
2,*4*,1,7
2,1,*4*,7   // 这样就找到了次大数
*2*,1,4,7
1,*2*,4,7   // 次次大数(已经有序)
*1*,2,4,7   // 排序成功


由此可见:N个数字要排序完成,总共进行N-1趟排序,每i趟的排序次数为(N-i)次,所以可以用双重循环语句,
外层控制循环多少趟,内层控制每一趟的循环次数

优点:每进行一趟排序,就会少比较一次,因为每进行一趟排序都会找出一个较大值。
如上例:第一趟比较之后,排在最后的一个数一定是最大的一个数,
第二趟排序的时候,只需要比较除了最后一个数以外的其他的数,同样也能找出一个最大的数排在参与第二趟比较的数后面,
第三趟比较的时候,只需要比较除了最后两个数以外的其他的数,
以此类推……也就是说,没进行一趟比较,每一趟少比较一次,一定程度上减少了算法的量。

**/


// 原理:
// a.将数组中第一个数和下一个数比较大小,第一个数小则不动,否则和第二个数交换位置
// b.将新的到的第二个数和第三个数比较,重复第一步步骤,直到倒数第二个数与数组最末尾的数比较大小,
// 这样就可以得到一个最大的数在末尾,既是冒泡
// c.忽略排好队数字,对原数组中剩下的数继续操作,直到所有数都排完

function aSort(arr) {
  for(var i = 0; i < arr.length - 1; i++){
     for(var j = 0; j < arr.length -1 -i ; j++){
       if(arr[j] > arr[j + 1]){
         var temp = arr[j];
         arr[j] = arr[j + 1];
         arr[j+1] = temp;
       }
     }
   }   
   return arr;
}

var myArr = [10,1,35,61,89,36,55]
//调用函数
var b = aSort(myArr)
console.log(b)  // [1, 10, 35, 36, 55, 61, 89]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值