数组操作

删除数组的重复项

  1. const arr = [1, 2, 1, 12, 2, 1, 12, 2, 1]
  2. 1. const uniqueArr = Array.from(new Set())
  3. 2. const uniqueArr = [...new Set(arr)]
  4. 3. const uniqueArr = arr => {
  5. let tmp = {}
  6. arr.forEach(i => {
  7. tmp[i] = 0
  8. })
  9. return Object.keys(tmp)
  10. }

替换数组中的特定值
有时在创建代码时需要替换数组中的特定值,有一种很好的简短方法可以做到这一点,咱们可以使用.splice(start、value to remove、valueToAdd),这些参数指定咱们希望从哪里开始修改、修改多少个值和替换新值。

  1. arr.splice(start, value to remove , valueToAdd, ...valueToAdd)

Array.from 达到 .map 的效果 使用.map() 方法,.from() 方法也可以用来获得类似的效果且代码也很简洁。
Array.from(arrayLike[, mapFn[, thisArg]])
arrayLike
想要转换成数组的伪数组对象或可迭代对象。
mapFn 可选
如果指定了该参数,新数组中的每个元素会执行该回调函数。
thisArg 可选
可选参数,执行回调函数 mapFn 时 this 对象。

  1. const friends = [
  2. {
  3. name: '123',
  4. age: 18
  5. },
  6. {
  7. name: '234',
  8. age: 20
  9. }
  10. ]
  11. Array.from(friends, ({ name }) => name)

置空数组
有时候我们需要清空数组,一个快捷的方法就是直接让数组的 length 属性为 0,就可以清空数组了。

  1. arr.legth = 0

将数组转换为对象
有时候,出于某种目的,需要将数组转化成对象,一个简单快速的方法是就使用展开运算符号(…):

  1. obj = { ...arr }

用数据填充数组
在某些情况下,当创建一个数组并希望用一些数据来填充它,这时 .fill()方法可以帮助咱们。

  1. const arr = new Array(10).fill('1')

数组合并
使用展开操作符,也可以将多个数组合并起来。

  1. 1. arr.concat(arr2)
  2. 2. arr = [...arr2, ...arr3, ...arr4]

求两个数组的交集

求两个数组的交集在面试中也是有一定难度的正点,为了找到两个数组的交集,首先使用上面的方法确保所检查数组中的值不重复,接着使用.filter 方法和.includes 方法。

  1. ;[...new Set(arr)].filter(item => arr2.include(item))

从数组中删除虚值
在 JS 中,虚值有 false, 0,’’, null, NaN, undefined。可以 .filter() 方法来过滤这些虚值。

  1. var j = arr.filter(Boolean)

从数组中获取随机值
有时我们需要从数组中随机选择一个值。一种方便的方法是可以根据数组长度获得一个随机索引

  1. arrs[Math.floor(Math.random() * arrs.length)]

对数组中的所有值求和
JS 面试中也经常用 reduce 方法来巧妙的解决问题

  1. var nums = [1,23,3,4]
  2. total = nums.reduce((total,item)=> total + item ), 0)

:::warning 如果是空数组使用 reduce 并且没有赋初始值会抛出错误* Reduce of empty array with no initial value :::

类数组变数组

  1. 1. Array.from(args)
  2. 2. [].slice.call(args)
  3. 3. Array.prototype.slice.call(args)
  4. 4. Array.prototype.concat.apply([], args)
  5. 5. Array.protytype.splice.call(args, 0)

数组降维 * 二维数组

  1. const arr = [123, [234,983] , 888]
  2. 1. [].concat.call([], ...arr)
  3. 2. [].concat.apply([], arr)
  4. 3. [1, [2], 3].flatMap((v) => v)

数组降维 * 多维数组

  1. 1. const flattenDeep = (arr) => {
  2. Array.isArray(arr) ? arr.reduce( (a, b) => [...a, ...flattenDeep(b)] , []) : [arr]
  3. }
  4. flattenDeep([1, [[2], [3, [4]], 5])
  5. 2. function flattenDeep() {
  6. let newArr = []
  7. function a(arr) {
  8. arr.forEach(val => {
  9. if (toString.call(val) === '[object Array]') {
  10. a(val)
  11. } else {
  12. newArr.push(val)
  13. }
  14. })
  15. return newArr
  16. }
  17. return a
  18. }
  19. flattenDeep()([1, [[2], [3, [4]], 5])
  20. 3.function flatten(arr) {
  21. while (arr.some(item => Array.isArray(item))) {
  22. arr = [].concat.apply([], arr);
  23. }
  24. return arr;
  25. }
  26. 4.let arr1 = arr.toString().split(',').map((val) => {
  27. return parseInt(val)
  28. })
  29. console.log(arr1)
  1. for of ```javascript const arr = { name: ‘ealien’, age: ‘18’, sex: ‘male’ }

for (const [key, val] of Object.entries(arr)) { console.log(key, val) } // name ealien // age 18 // sex male

  1. 17 数组乱序
  2. ```javascript
  3. function shuffle(arr) {
  4. let m = arr.length;
  5. while (m > 1){
  6. let index = Math.floor(Math.random() * m--);
  7. [arr[m] , arr[index]] = [arr[index] , arr[m]]
  8. }
  9. return arr;
  10. }