整理一下敲一敲常用的js方法

平常的项目中用到数组的地方挺多的,基本上从后台拿到的json数据不是对象就是数组

好记性不如我这24k氪金键盘啊,所以这里整理一下敲一敲常用的数组的操作

不积跬步,无以至千里 加油


concat

concat 会合并两个数组

const arr = [5, 17, 6, 8]
const arr1 = [5, 17, 6, 8, 6, 8]

arr.concat(arr1)
// [5, 17, 6, 8, 5, 17, 6, 8, 6, 8]

replace

replace 用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串。

// 表单验证需要判断20个字符,一个汉字等于2个字符
// 正则匹配所有的汉字,然后替换成字符,可以随意定义
value.replace(/[^/x00-\xff]/g, '**').length > 20

splice

arr.splice() 方法可以说是数组界的瑞士军刀。它可以做所有事情:添加,删除和插入元素。

// splice可接收多个参数。第一个参数表示数组起始位置,第二个参数表示需要删除元素的个数
// 如果后面还有参数,则将随后的全部参数插入到第一个参数表示的起始位置。

// 先从删除开始
var arr = ["I", "study", "JavaScript"];

arr.splice(1, 1); // from index 1 remove 1 element

alert( arr ); // ["I", "JavaScript"]

// 删除 3 个元素,并用另外两个元素替换它们:
var arr = ["I", "study", "JavaScript", "right", "now"];

// remove 3 first elements and replace them with another
arr.splice(0, 3, "Let's", "dance");

alert( arr ) // now ["Let's", "dance", "right", "now"]

// 可以将第二个参数 deleteCount 设置为 0, 就能够插入元素而不用删除
var arr = ["I", "study", "JavaScript"];

// from index 2
// delete 0
// then insert "complex" and "language"
arr.splice(2, 0, "complex", "language");

alert( arr ); // "I", "study", "complex", "language", "JavaScript"

slice

它从所有元素的开始索引 "start" 复制到 "end" (不包括 "end") 返回一个新的数组。

// start 和 end 都可以是负数,在这种情况下,从末尾计算索引。
// 它和字符串的 str.slice 有点像,就是把子字符串替换成子数组。
var str = "test";
var arr = ["t", "e", "s", "t"];

alert( str.slice(1, 3) ); // es
alert( arr.slice(1, 3) ); // e,s

alert( str.slice(-2) ); // st
alert( arr.slice(-2) ); // s,t

split

split 使用指定的分隔符字符串将一个String对象分割成 字符串数组

// 简单点 
'abcdef'.split('') // ["a", "b", "c", "d", "e", "f"] 

// 字符串翻转
'abcdef'.split('').reverse().join('') // fedcba

substr

substr 返回一个字符串中从指定位置开始到指定字符数的字符。

接受两个参数 substr(start, length) 第一个参数表示开始位置的下标,第二个参数(可选)表示提取的字符数

(function parseQueryString(url) {
  var json = {};
  var arr = url.substr(url.indexOf('?') + 1).split('&');
  // [key0 = 0, key1 = 1, key2 = 2]
  arr.forEach(function(item) {
    var tmp = item.split('=');
    json[tmp[0]] = tmp[1];
  })
  console.log(json) // {key0: "0", key1: "1", key2: "2"}
  return json;
})('http://shihaoran.top/index.html?key0=0&key1=1&key2=2')

some

匹配数组中每一个元素,如果有一个元素通过由提供的函数实现的测试,则立刻返回true,否则返回false

  // 可以用到的地方就很多了,比如需要判断返回的数据中存不存在某个元素,就可以用这个方法来判断
const arr = [5, 17, 6, 8]

arr.some(e => { return  e > 9 }) // true

every

匹配数组中每一个元素,如果所有元素都通过由提供的函数实现的测试,则返回true,有一个没有通过则返回false

const arr = [5, 17, 6, 8]

arr.every(e => { return  e > 9 }) // false

filter

筛选出数组中符合条件的元素,组成一个新的数组

const arr = [5, 17, 6, 8]

// 可以过滤出想要的元素再进行操作
arr.concat(arr1).filter(e =>  e > 7) // [17, 8]

const arr1 = [ 'name1', 'name2', 'name3', 'name2' ]

// filter 可以接收3个参数 第一个参数表示数组中的元素,另外两个参数表示元素的位置和数组本身
// 利用这3个参数,可以进行数组去重
arr.filter((item, index, self) => {
  // indexOf 总是返回第一个元素的位置 后续的重复元素位置与indexOf返回的位置不相等,因此被filter滤掉了。
  return self.indexOf(item) === index
})

// [ 'name1', 'name2', 'name3' ]

map

数组中的每个元素都调用一个提供的函数后返回一个新数组

const kvArr = [
    {key: 1, value: 10},
    {key: 1, value: 10},
    {key: 1, value: 10},
    {key: 2, value: 20},
    {key: 3, value: 30},
    {key: 4, value: 30},
]

kvArr.map(item => item.key).filter(e => e > 1) //  [2, 3, 4]

forEach

让数组中的每一项做一件事

const kvArr = [
    {key: 1, value: 10},
    {key: 1, value: 10},
    {key: 1, value: 10},
    {key: 2, value: 20},
    {key: 3, value: 30},
    {key: 4, value: 30},
]

kvArr.forEach(item => console.log(item))
// {key: 1, value: 10}
// {key: 1, value: 10}
// {key: 1, value: 10}
// {key: 2, value: 20}
// {key: 3, value: 30}
// {key: 4, value: 30}

push 改变原数组

将一个或多个元素添加到数组的末尾,并返回新数组的长度

const arr = [5, 17, 6, 8]

arr.push(4) // 5

includes

方法用来判断一个数组是否包含一个指定的值,返回 true或 false

// includes 可以接收第二个参数, arr.includes(item, from) — 从索引 from 查询 item,如果找到则返回 true。
const arr = [5, 17, 6, 8]

arr.includes(5) true

join

将数组(或一个类数组对象)的所有元素连接到一个字符串中

const kvArr = [
    {key: 1, value: 10},
    {key: 1, value: 10},
    {key: 1, value: 10},
    {key: 2, value: 20},
    {key: 3, value: 30},
    {key: 4, value: 30},
]

kvArr.map(item => {return item.key}).join(',')
//1,1,1,2,3,4

reduce

从左到右为每个数组元素执行一次回调函数,并把上次回调函数的返回值放在一个暂存器中传给下次回调函数,并返回最后一次回调函数的返回值。

// 上次写的一个综合性的应用,从数组中取出所有的businessType并且去重
// 需要注意的是,string也有concat方法,所以这里需要用到reduce的第二个参数,initialValue(作为第一次调用 callback 的第一个参数。) 传[]
const shopInfo = [{
  shopName: '111',
  businessType: '1's
}, {
  shopName: '222',
  businessType: '2'
}, {
   shopName: '333',
   businessType: '2'
 }]
const businessTypeList = [...new Set(shopInfo.map(item => item.businessType).reduce((x, y) => x.concat(y), []))]

Object.assign()

ES6中提供了Object.assign() ,用于合并/复制对象的属性。

const obj1 = {z: z}
const saveArgs = Object.assign({}, obj1, {
  x: x,
  y: y
})
 // 花括号叫目标对象,后面的obj1等等是源对象。对象合并是指:将源对象里面的属性添加到目标对象中去,若两者的属性名有冲突,后面的将会覆盖前面的

数组去重

// new Set 中的元素只可以出现一次,返回一个新的Set对象
// Array.from()再从一个类似数组或可迭代对象中创建一个新的数组实例
Array.from(new Set(kvArr.map(item => item.key)))

//可以用es6的 ... 的解构赋值
[...new Set(kvArr.map(item => item.key))]
// 定义一个空数组 let ret = []
// include判断是否包含元素
// push 如果不包含,则push到ret
let ret = []
kvArr.map(item => item.key).map(e => {
    if (!ret.includes(e)) {
      ret.push(e)
      return ret
    }
})
ret.map(a => {
    switch(a) {
        case 1 :
          return console.log(111)
        case 2 :
          return console.log(222)
    }
})

数组求和

// arguments对象 包含传递给函数的每个参数 (箭头函数中没有arguments对象)
// call的第一个参数表示真正调用reduce的环境变为了arguments对象
// 也就是reduce方法中的this是指向arguments的。所以就好像arguments也具有了数组的方法。
// 能调用call的只有方法,所以不能用[].call这种形式,得用[].reduce.call
function sum(){
    return [].reduce.call(arguments,function(x,b){
         return (x|0)+(b|0);
    })
}
sum(1, true, 'a', 'D', 1, 'F', 1, 'w')
// 4

对象转数组

const obj = { a: 1, b: 2 }

Object.keys(obj).map(key => { return { key: key, value: obj[key] }})

数组排序

[2,51,11,62,91,4,4,444,33,5].sort((x,y) => x-y)
// [2, 4, 4, 5, 11, 33, 51, 62, 91, 444]

// sort也可以根据数组对象中的某一个字段排序
const obj = [{
  position: '4'
},{
  position: '999'
},{
   position: '1'
}]
obj.sort((x, y) => x.position - y.position)

// [{ position: '1' }, { position: '4' }, { position: '999' }]