js數組精講和排序算法

js數組精講和排序算法 mdn :)


數組和length
/**
 * @title 數組和length 
 */
//define array
const arr = [];
const arr1= new Array();

// length 有縮短數組的做用 
consr arr = [1,2,3]
arr.length = 2;

console.log(arr)
// [1,2]

// 解構賦值
const [a, ...b, c] = [1,2,3,4,5]
concat
/**
 * @function concat
 * @notice concat 操做的參數是數組,那麼添加的是數組中的元素,而不是數組
 */
let concat_demo1 = () => {
  let a = ['js','css','html'];
  let b = ['c','c++'];
  let d = ['java','python'];
  // concat 能夠同時合併多個數組 ,返回值是合併的數組
  let c = a.concat(b, d);
  c.concat('c#')
  console.log(c)
  b[0] = 99;
  console.log(b)
  console.log(c)
}

let concat_demo2 = () => {
  let tom = [
    {
      name: 'tom',
      age: 21
    }
  ];
  let mary = [
    {
      name: 'mary',
      age: 33
    },
  ];
  let c = tom.concat(mary);
  console.log(c)
  // concat 操做結果是淺拷貝
  tom[0].name = 'tommy'
  console.log(c)
}
自行實現concat
// 手動實現concat 
  Array.prototype.concat1 = function (...args) {
    const res = []
    args.forEach((item ,index, arr)=> {
      if(Array.isArray(item)){
        res.push(...item)
      }else {
        res.push(item)
      }
    })

    return [...this, ...res]
  };
join
/**
 * @function join
 * @desc 把數組每一項用一個符號連接
 */
const join_demo1 = () => {
  const arr = ['吃','喝', '睡', '笑']
  const res = arr.join("&")
  console.log(res)
}
// 手動實現一個join方法
pop
/**
 * @function pop
 * @desc 出棧 刪除數組的最後一個元素,並返回
 * @return
 */
const pop_demo = () => {
  const arr = ['小花','小麗','小紅','小明']
  const res= arr.pop()
  console.log(arr)
  console.log(res)
}
// 手動實現一個pop方法
push
/**
 * @function push
 * @desc 入棧 往數組裏從後加幾個元素
 * @return 返回結果數組的長度
 */

const push_demo = () => {
  const arr = ['大黃']
  arr.push('小黑')
  arr.push('旺財','大金', '老王')
  console.log( arr.push(9))
}

push_demo()

// 手動實現一個push方法
reverse
/**
 * @function reverse
 * @desc  反轉原數組,不會生成信得數組
 * @return
 */
const arrr = [1,2,3,4]
console.log(arrr.reverse())
shift
/**
 * @function shift
 * @desc 出隊 刪除數組第一個值,並返回
 */
const shift_demo = () => {
  const arr = ['產品經理','前端開發','後端開發','設計師']
  console.log(arr.shift())
}


// 手動實現shift
unshift
/**
 * @function unshift
 * @desc 入隊 方法可向數組的開頭添加一個或更多元素,並返回新的長度
 */
const unshift_demo = () => {
  const arr = ['產品經理','前端開發','後端開發','設計師']
  console.log(arr.unshift('測試'))
  arr.unshift('項目經理', '數據')
}

unshift_demo()
// 手動實現unshift
slice
/**
 * @function slice 切片
 * @desc 原數組返回 子數組 不會
 */
const slice_demo = () => {
  const arr =  ['蘋果', '小米' , '三星' ,'華爲']
  const arr1 = arr.slice(0, 2)
  const arr2 = arr.slice(0 ,-1)
  //最後一個元素
  const arr3 = arr.slice(-1);
  const arr4 = arr.slice(0)

  console.log(arr1)
  console.log(arr2)
  console.log(arr3)
  console.log(arr4)
}
splice
/**
 * @function splice
 * @desc 刪除,增長數組
 */

const splice_demo = () => {
  const arr = ['蘋果', '香蕉' , '榴蓮' ,'葡萄'];
  const item = arr.splice(1, 1);
  console.log(item)
  console.log(arr)
  arr.splice(0,0, '橘子', '荔枝', '哈密瓜')
  console.log(arr)
}
// 手動實現splice
includes
/**
 * @function includes
 */

const includes_demo =  () => {
  const arr = [NaN, NaN, 1, 2]

  // indexOf()返回的是數值,而includes()返回的是布爾值
  // indexOf() 不能判斷NaN,返回爲-1 ,includes()則能夠判斷
  console.log(arr.includes(NaN))
  console.log(arr.indexOf(NaN))
}

includes_demo()
forEach,map, filter, some, every, reduce
/**
 * @function  forEach,map, filter, some reduce
 */

const loop_demo = () => {
   const arr = [11,2,23,4,25];

   // forEach 是普通循環
  arr.forEach((item,index,arr) => {
    // console.log(item,index,arr)
  })

  // map 是映射,把原數組,映射爲新的數組
  const arr2 = arr.map((item,index,arr) => {
    return item *2;
  })

  // filter 是過濾數組知足提交的
  const arr3 = arr.filter((item,index,arr) => {
    return item > 10
  })
  
  // every 表示是否每一個元素都知足條件
  const arr5 = arr.every(item => item > 10)
  console.log(arr5)

  // some 返回數組中 任意一個知足條件就返回true
  const arr4 = arr.some((item,index,arr) => {
    return item > 10
  })

  const list = ['tom', 'lisa', 'tina']
  // reduce 累加器,把上一次的結果再處理一次
  const res = list.reduce((prev, item,index) => {
    prev[item] = index;
    return prev;
  }, {})
  console.log(res)
}

const arr1 = [
  [11,22],
  [77,99],
  [88,66]
]

const res = arr1.reduce((prev ,item, index, arr) => (prev['x'+ (index+1)] = item[0], prev['y'+ (index+1)] = item[1], prev) , {})

console.log(res)


loop_demo()
數組排序1 - 默認排序
const list = [3, 999,22, 1, 223, 99, 8, 7, 6, 0];

// 默認排序方法
list.sort(function (a, b) {
  return a - b
})
數組排序2 - 選擇排序
// 選擇排序,每次選擇最小的
function getMin(arr) {
  const _index = 0;
  const min = arr[0];
  arr.forEach((item, index) => {
    if (item < min) {
      min = item;
      _index = index;
    }
  })
  return _index;
}

function chooseSort(arr) {
  let res = [];
  while (arr.length) {
    res = [...res, ...arr.splice(getMin(arr), 1)]
  }
  return res;
}
數組排序3 - 冒泡排序
// 冒泡排序 若是前一個比後邊的大,交換位置
function bubbleSort(list) {
  const {length} = list;
  for (let a = 0; a < length -1; a++) {
    for(let b = 0; b < length -1-a; b++){
      if (list[b] > list[b + 1]) {
        const temp = list[b];
        list[b] = list[b +1]
        list[b +1] = temp;
      }
    }
  }
}
相關文章
相關標籤/搜索