数组 Array

| 数组n次添加相同的元素

1、对于primitives,请使用.fill let myArray = new Array(times).fill(elemnt) 2、对于non-primitives,不要使用fill,因为那时数组中的所有元素都将引用内存中的同一个对象,因此数组中一个项的突变将影响数组中的每个项。相反,在每次迭代时显式创建对象,可以用Array.from:

var fruits = Array.from(
  { length: 4 },
  () => ({ Lemon: 'Lemon' })
);
console.log(fruits);

| 关于数组对象

触发数组对象,视图更新: this.$set(‘数组变量’,index,newVal); this.$set(‘eMsg[‘+index+’]’,false); this.arr.splice(n,1,newVal); Obiect.assign({},obj,{a:1}); 取数组中最大值:Math.max.apply(Math,arr) 取数组中最小值:Math.min.apply(Math,arr)

| 验证是否为数组

function isArray(obj) {
  return Object.prototype.toString.call(obj) === '[object Array]'
}

| 数组插入 (同样是插入数据,第二种效率高很多)

var arr = [1,2,3,4,5];
arr.push(6);
arr[arr.length] = 6;
arr.concat([6])

var arr = [1,2,3,4,5];
arr.unshift(0);
[0].concat(arr);   unshift修改了原来的数组而concat返回一个新的数组

使用splice在数组中间插入是最高效的做法
var items = ['one', 'two', 'three', 'four',"five"];
items.splice(items.length / 2, 0, 'hello');

| 数组去重

let arr = [1, 2, 2, 3]
let set = new Set(arr)
let newArr = Array.from(set) // Array.from方法可以将 Set 结构转为数组。
console.log(newArr) // [1, 2, 3]
  • 最短代码实现数组去重 [...new Set([1, "1", 2, 1, 1, 3])]

  • 数组去重 > for 循环给 obj 添加 attr,for in 遍历 obj 将属性值 push 进 arr

//过滤重复的,key判断当前对象是否重复
filter: (arry, key) => {
  let obj = {}
  arry = arry.reduce((cur, next) => {
    obj[next.key] ? '' : (obj[next.key] = true && cur.push(next))
    return cur
  }, []) //设置cur默认类型为数组,并且初始值为空的数组
  return arry
}

| 数组排序

.sort() => 参数可选,规定排序顺序。必须是函数。

[1,2,5,10].sort() => [1, 10, 2, 5]

正确排序:[1,2,5,10].sort((a, b) => a - b) => => [1, 2, 5, 10 ]

*根据数组对象中的某个属性值进行排序:sort 方法接收一个函数作为参数,这里嵌套一层函数用来接收对象属性名,其他部分代码与正常使用 sort 方法相同。

var arr = [
  { name: 'zopp', age: 0 },
  { name: 'gpp', age: 18 },
  { name: 'yjj', age: 8 },
]

function compare(property) {
  return function (a, b) {
    var value1 = a[property]
    var value2 = b[property]
    return value1 - value2
  }
}
console.log(arr.sort(compare('age')))

| 复制数组

arr = [1, 2, 3, 4]
const arr2 = [...arr]

| 获取数组末尾元素

let array = [0, 1, 2, 3, 4, 5, 6, 7]
console.log(array.slice(-1)) // >>> [7]
console.log(array.slice(-2)) // >>> [6, 7]
console.log(array.slice(-3)) // >>> [5, 6, 7]

| 数组方法

Array.reduce

语法:

array.reduce(function(accumulator, currentValue, currentIndex, array), initialValue)

accumulator:上一次调用回调返回的值,或者是提供的初始值(initialValue)

currentValue:数组中正在处理的元素

currentIndex:数据中正在处理的元素索引,如果提供了 initialValue ,从 0 开始;否则从 1 开始

array: 调用 reduce 的数组

initialValue:可选项,其值用于第一次调用 callback 的第一个参数。如果没有设置初始值,则将数组中的第一个元素作为初始值。空数组调用 reduce 时没有设置初始值将会报错。

[1,2,3,4].reduce(function(a,b,c,d){
    console.log(a,b,c,d);
    return a;
})

结果
1 2 1 [1,2,3,4]
1 3 2 [1,2,3,4]
1 4 3 [1,2,3,4]

[1,2,3,4].reduce(function(a,b,c,d){
    console.log(a,b,c,d);
    return a+b;
})

结果
1 2 1 [1,2,3,4]
3 3 2 [1,2,3,4]
6 4 3 [1,2,3,4]

[1,2,3,4].reduce(function(a,b,c,d){
    console.log(a,b,c,d);
    return a;
},9)

结果
9 1 0 [1,2,3,4]
9 2 1 [1,2,3,4]
9 3 2 [1,2,3,4]
9 4 3 [1,2,3,4]


[1,2,3,4].reduce(function(a,b,c,d){
    console.log(a,b,c,d);
    return a+b;
},9)


结果
9 1 0 [1,2,3,4]
10 2 1 [1,2,3,4]
12 3 2 [1,2,3,4]
15 4 3 [1,2,3,4]

_ findIndex() _

findIndex() 方法返回传入一个测试条件(函数)符合条件的数组第一个元素位置。

findIndex() 方法为数组中的每个元素都调用一次函数执行:

当数组中的元素在测试条件时返回 true 时, findIndex() 返回符合条件的元素的索引位置,之后的值不会再调用执行函数。 如果没有符合条件的元素返回 -1

注意:

  • findIndex() 对于空数组,函数是不会执行的。
  • findIndex() 并没有改变数组的原始值。

语法:array.findIndex(function(currentValue, index, arr), thisValue)

// 返回符合大于输入框中数字的数组索引:
var ages = [4, 12, 16, 20]
function checkAdult(age) {
  return age >= document.getElementById('ageToCheck').value
}
function myFunction() {
  document.getElementById('demo').innerHTML = ages.findIndex(checkAdult)
}

| 其他

打乱数字数组的顺序

var arr = [1, 2, 3, 4, 5, 6, 7, 'a', 'dsfs', 8, 9, 'v']
arr.sort(function () {
  return Math.random() - 0.5
})

生成从 0 到指定值的数字数组

var arr = [],
  length = 4,
  i = 1
for (; arr.push(i++) < length; ) {}
console.log(arr)

使用同一个方法处理数组和单一元素

function printUpperCase(words) {
  var elements = [].concat(words)
  for (var i = 0; i < elements.length; i++) {
    console.log(elements[i].toUpperCase())
  }
}
printUpperCase('cactus')
// => CACTUS
printUpperCase(['cactus', 'bear', 'potato'])
// => CACTUS
// BEAR
// POTATO

—– 传参的情况下,取事件对象:window.event || arguments[0].target;

展开运算符

odd = [1, 3, 5]
const nums = [2, 4, 6, ...odd]
console.log(nums) // [ 2, 4, 6, 1, 3, 5 ]

插入随机位置

const odd = [1, 3, 5]
const nums = [2, ...odd, 4, 6]

用最短的代码实现一个长度为 m(6)且值都 n(8)的数组

`Array(6).fill(8)`

取出一个数组中的最大值和最小值

`var numbers = [5, 458 , 120 , -215 , 228 , 400 , 122205, -85411]; `
`var maxInNumbers = Math.max.apply(Math, numbers); `
`var minInNumbers = Math.min.apply(Math, numbers);`

获取数组对象中某一属性值的集合

// from 方法
var user = [ { id: 1,   name: "李四"  }, {  id: 2, ame: "张三"  },  { id: 3, name: "李五" } ]
var userName = Array.from(user,({name})=>name);
console.log(userName); // ["李四", "张三", "李五"]
// map 方法
var userName = user.map((item)=>{ return item.name; })
console.log(userName); // ["李四", "张三", "李五"]
// foreach 方法
var userName = [];
user.forEach((item)=>{ userName.push(item.name); })
console.log(userName); // ["李四", "张三", "李五"]