JavaScript数组与字符串

字符串

JS字符串转数组

split()方法

var string = "1,2,3,4,5,6,7,8,9,10"
var array = string.split(',')
var arrayLimit = string.split(',', 5)	// 限制前5个
console.log(array)      	 // ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"]
console.log(arrayLimit)	  	 // ["1", "2", "3", "4", "5"]

数组

JS数组转字符串

1. join()方法,转换为指定符号分隔的字符串

该方法不指定参数的时候,默认以逗号进行分隔;也可以指定用于分隔的参数

var array = [1,2,3,4,5,6,7,8,9,10]
var stringOfComma = array.join(',')		// join()默认以逗号分隔
var stringOfSemicolon = array.join(';')
console.log(stringOfComma)				// 1,2,3,4,5,6,7,8,9,10
console.log(stringOfSemicolon)			// 1;2;3;4;5;6;7;8;9;10

2. JSON.stringify(),转换为JSON字符串

var array = [1,2,3,4,5,6,7,8,9,10]
var stringOfJSON = JSON.stringify(array)
console.log(stringOfJSON)			// [1,2,3,4,5,6,7,8,9,10]

JS判断两个数组是否相同

1. 完全相同

every():检测数值元素的每个元素是否都符合条件。
a. 首先判断两个数组长度,长度不相等自然就可以直接判定其不相同。
b. 长度相等则可以借助数组的every()函数进行验证,如图:item指arrayFir的每个元素,index为每个元素对应的索引,因此依次判断item和arraySec中对应索引元素的值,当全都相等的时候,该方法将返回true,说明两个数组完全相等。

arrayCompare(arrayFir, arraySec) {
    
    
	// 可先判断两个数组长度是否相等,不相等则没有逐一比较的必要
	if (arrayFir.length != arraySec.length) {
    
    
		return false
	}
	// 通过every函数进行比较
	return arrayFir.every((item, index) => item == arraySec[index])
	
	/* return arrayFir.every((item,index) => {
		console.log(item)
		return item == arraySec[index]
	}) */
	/* return arrayFir.every(function(item,index) {
		console.log(item);
		return item == arraySec[index]
	}) */
},

例:
示例1

2. 元素相同,不关心排序

arrayCompare(arrayFir, arraySec) {
    
    
	// 可先判断两个数组长度是否相等,不相等则没有逐一比较的必要
	if (arrayFir.length != arraySec.length) {
    
    
		return false
	}
	// 转换成排序的JSON字符串进行比较
	return JSON.stringify(arrayFir.sort()) == JSON.stringify(arraySec.sort())
},

例:
在这里插入图片描述
经过排序后,二者拥有相同的元素

在这里插入图片描述

遍历数组

1. map

有返回值,返回一个新数组,其元素为:原数组中元素调用func的结果。

let list = [1, 2, 3, 4, 5]
let arr = list.map((d, i) => {
    
    
	return d * 2
})
console.log(arr)
// [2, 4, 6, 8, 10]

2. filter

有返回值,返回一个新数组,其元素为:原数组中符合func条件的元素。

let list = [1, 2, 3, 4, 5]
let arr = list.filter((d, i) => {
    
    
	return d % 2  // 取余
})
console.log(arr)
// [1, 3, 5]
let list = [1, 2, 3, 4, 5]
let arr = list.filter((d, i) => {
    
    
	return d % 2 == 0
})
console.log(arr)
// [2, 4]

3. some

对数组中的每一个元素进行遍历,遇到return true退出循环

var list = [1, 2, 3, 4, 5, 6]
var sum = 0
list.some(item => {
    
    
	sum = sum + item
	if(item === 5) {
    
    
		return true
	}
})
console.log(sum)
//sum == 15

返回一个boolean,判断是否有元素符合func条件,如果有一个元素符合func条件,则循环终止,返回true。
可以用来判断一个数组中是否有满足某条件的元素。

let list = [1, 2, 3, 4, 5]
let boolean = list.some((d, i) => {
    
    
	console.log(d, i)
	return d > 3
})
// 1,0   2,1   3,2   4,3
// boolean: true	存在大于3的元素,循环被终止
let list = [1, 2, 3, 4, 5]
let boolean = list.some((d, i) => {
    
    
	return d > 6
})
// boolean: false	不存在大于6的元素,循环未被终止

4. every

对数组中的每一个元素进行遍历,遇到return false退出循环

var list = [1, 2, 3, 4, 5, 6]
var sum = 0
list.every(item => {
    
    
	sum = sum + item
	if(item === 5) {
    
    
		return false
	}
	return true // 需要有return true,否则循环不会继续
})
console.log(sum)
//sum == 15

返回一个boolean,判断每个元素是否符合func条件,如果有一个元素不满足func条件,则循环终止,返回false。
可用于判断一个数组中的元素是否都满足某条件;或者一个数组中是否有不满足某条件的元素。

let list = [1, 2, 3, 4, 5]
let boolean = list.every((d, i) => {
    
    
	console.log(d, i)
	return d < 3
})
// 1,0   2,1   3,2
// boolean: false	存在不小于3的元素,循环被终止
let list = [1, 2, 3, 4, 5]
let boolean = list.every((d, i) => {
    
    
	return d < 6
})
// boolean: true	所有元素均小于6,循环未被终止

5. forEach

无返回值,对数组中的每一个元素进行遍历,直到循环完成,无法使用break,return等终止循环。值得注意的是,return虽不能终止循环,但其后面的代码是无法执行到的。

var list = [1, 2, 3, 4, 5, 6]
var sum = 0
list.forEach(item => {
    
    
	sum = sum + item
	if(item === 3)
		return true
	if(item === 4)
		return false
	if(item === 5)
		return
})
console.log(sum)
//sum == 21

var list = [1, 2, 3, 4, 5, 6]
var sum = 0
list.forEach(item => {
    
    
	if(item === 3) {
    
    
		return true
	}
	sum = sum + item
	if(item === 4)
		return false
	if(item === 5)
		return
})
console.log(sum)
//sum == 18
let list = [1, 2, 3, 4, 5]
let arr = []
list.forEach((d, i) => {
    
    
	arr.push(d * 2)
})
console.log(arr)
// [2, 4, 6, 8, 10]

6. for in

for in 实际是为循环可枚举性(enumerable)对象而设计的,也可以循环数组(不建议使用)。
a. 循环对象时,得到的是对象的key,不能直接得到value;

var obj = {
    
    a:1, b:2, c:3}
for (var key in obj) {
    
    
	console.log("obj." + key + " = " + obj[key])
}
// "obj.a = 1"   "obj.b = 2"   "obj.c = 3"

b. 循环数组时,得到的是数组的index下标;

const arr = [1, 2 ,3, 4]
for (const key in arr) {
    
    
	console.log(key) // 输出 0 1 2 3
}

7. for of

for of 为ES6提供,可遍历带有iterator接口的,如Set,Map,String,Array。也就是说,for of循环内部调用的是数据结构的Symbol.iterator方法。
使用的范围包括数组、Set和Map结构、某些类似数组的对象(比如arguments对象、DOM NodeList对象)、Generator对象,以及字符串。
不可遍历普通的对象。

// 字符串
let str = "hello"
for (let s of str) {
    
    
	console.log(s) // h e l l o
}
// 遍历数组
let arr = [1, 2, 3, 4, 5]
for (let e of arr) {
    
    
	console.log(e)
}
// 1   2   3   4   5

8. entries、keys、values

有些数据结构是在现有数据结构的基础上,计算生成的。比如,ES6的数组、Set、Map都部署了以下三个方法,调用后都返回遍历器对象,所遍历的都是计算生成的数据结构。
a. entries
entries() 返回一个遍历器对象,可用于遍历[键名, 键值]组成的数组。对于数组,键名就是索引值;对于Set,键名与键值相同。Map结构的iterator接口,默认就是调用entries方法。

// 遍历数组
let arr = ['a', 'b', 'c']
for (let item of arr.entries()) {
    
    
	console.log(item)	// 得到的是索引加值
}
// [0, "a"]   [1, "b"]   [2, "c"]
for (let [index, item] of arr.entries()) {
    
    
	console.log(index, item)
}
// 0 "a"   1 "b"   2 "c"

// 遍历对象,使用Object.entries方法将对象的[键名,键值]组成一个数组,然后遍历这个数组。
let obj = {
    
    a:1, b:2, c:3}
for (let item of Object.entries(obj)) {
    
    
	console.log(item)
}
// ["a", 1]   ["b", 2]   ["c", 3]
for (let [key, value] of Object.entries(obj)) {
    
    
	console.log(key, value)
}
// a 1   b 2   c 3

b. keys
keys() 返回一个遍历器对象,可用于遍历所有的键名。对于数组,则为索引值。

// 遍历数组
let arr = ['a', 'b', 'c']
for (let item of arr.keys()) {
    
    
	console.log(item)
}
// 0   1   3

// 遍历对象,使用Object.keys方法将对象的键名生成一个数组,然后遍历这个数组。
let obj = {
    
    a:1, b:2, c:3}
for (let key of Object.keys(obj)) {
    
    
	console.log(key, obj[key])
}
// a 1   b 2   c 3

c. values
values() 返回一个遍历器对象,可用于遍历所有的键值。

// 遍历数组
let arr = ['a', 'b', 'c']
for (let item of arr.values()) {
    
    
	console.log(item)
}
// a   b   c

// 遍历对象,使用Object.keys方法将对象的键值生成一个数组,然后遍历这个数组。
let obj = {
    
    a:1, b:2, c:3}
for (let value of Object.values(obj)) {
    
    
	console.log(value)
}
// 1   2   3

9. reduce

定义和用法
  reduce() 方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值。
  reduce() 可以作为一个高阶函数,用于函数的 compose。
注意: reduce() 对于空数组是不会执行回调函数的。

  prev:上一次调用 callbackFn 时的返回值。

语法

array.reduce(function(total, currentValue, currentIndex, arr), initialValue)
参数 描述
function(total, currentValue, index, arr) 必需。用于执行每个数组元素的函数。
initialValue 可选。传递给函数的初始值

函数参数

参数 描述
total 必需。初始值, 或者计算结束后的返回值。在第一次调用时,若指定了初始值 init,其值则为 init,否则为数组索引为 0 的元素 arr[0]。
currentValue 必需。当前元素;在第一次调用时,若指定了初始值 init,其值则为数组索引为 0 的元素 arr[0],否则为 arr[1]。
index 可选。当前元素的索引;若指定了初始值 init,则起始索引号为 0,否则从索引 1 起始。
arr 可选。当前元素所属的数组对象。

示例
a. 数组求和

var arr = [1, 2, 3]
var sum = arr.reduce((total, item) => {
    
    
	return total + item
})
console.log(sum)
// sum == 6

b. 求数组最大值

var arr = [3, 9, 9]
var max = arr.reduce((total, item) => {
    
    
	return Math.max(total, item)
})
console.log(max)
// max == 9

c. 扁平化数组

var arr = [[1, 2, 8], [3, 4, 9], [5, 6, 10]]
var res = arr.reduce((prev, cur) => prev.concat(cur), [])
console.log(res)
// [1,2,8,3,4,9,5,6,10]
let arr = [[1, 2, [3, 4], 5], [6, 7, 8], [[9, 10], 11]]
function flat(arr) {
    
    
	return arr.reduce(function(prev, cur) {
    
    
		return prev.concat(Array.isArray(cur) ? flat(cur) : cur)
	}, [])
}
console.log(flat(arr))
// [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
let arr = [[1, 2, [3, 4], 5], [6, 7, 8], [[9, 10], 11]]
console.log(this.flat(arr))
// [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]

methods: {
    
    
	flat(arr) {
    
    
		var that = this
		return arr.reduce(function(prev, cur) {
    
    
			return prev.concat(Array.isArray(cur) ? that.flat(cur) : cur)
		}, [])
	}
}

猜你喜欢

转载自blog.csdn.net/qq_45580300/article/details/125808241