数组操作方法总结

本文总结了JavaScript中的常用数组操作方法,包括join(), reverse(), concat(), slice(), splice(), push(), pop(), shift(), unshift(), indexOf(), lastIndexOf(), sort(), forEach(), map(), filter(), every(), some(), reduce(), reduceRight()等。还介绍了如何在Vue中进行列表渲染,以及数组更新和对象变更的检测,提供了解决响应式问题的方法。" 48937999,5104563,Linux 共享对象与共享库创建及安装教程,"['Linux开发', 'C编程', '链接器', '系统编程']

(1)常用数组操作方法

1. join()
功能:将数组中所有元素都转化为字符串并连接在一起。

2. reverse()
功能:将数组中的元素颠倒顺序。

3. concat()
功能:数组拼接的功能 ,返回新数组,原数组不受影响。

4. slice()
截取数组生成新数组,原数组不受影响。
返回的数组包含第一个参数指定的位置和所有到但不含第二个参数指定位置之间的所有元素。如果为负数,表示相对于数组中最后一个元素的位置。如果只有一个参数,表示到数组末尾。

var aa = [1,2,3,4,5,6];
console.log(aa.slice(2)); //[3,4,5,6]
console.log(aa.slice(2,8)); //[3,4,5,6] 超过最大长度,只显示到最后结果
console.log(aa.slice(2,5)); //[3,4,5]
console.log(aa.slice(2,-1)); //[3,4,5] 相对于倒数第一个之前
console.log(aa.slice(2,-2)); //[3,4] 相对于倒数第二个之前
console.log(aa.slice(3)); //[4,5,6] 一个参数从第三个到最后
console.log(aa.slice(-2));//[5,6] 一个参数负值从倒数第二个到最后

5. splice()
功能:从数组中删除元素、插入元素到数组中或者同时完成这两种操作。
输入:第一个参数为指定插入或删除的起始位置,第二个参数为要删除的个数。之后的参数表示需要插入到数组中的元素 。如果只有一个参数,默认删除参数后边的所有元素。
输出:返回一个由删除元素组成的数组。
注意:新建了一个数组,并修改了原数组

var aa = [1,2,3,4,5,6];
console.log(aa.splice(4)); //[5,6]  返回删除后的数组
aa; // [1,2,3,4]
console.log(aa.splice(2,2)); //[3,4] 从第二位起删除两个元素
aa; //[1,2]
console.log(aa.splice(1,0,7,8)); //[]从第一位起删除0个元素,添加7,8到原数组
aa;//[1,7,8,2]

6. push()
在数组末尾添加一个或多个元素,并返回新数组长度

7. pop()
从数组末尾删除1个元素(删且只删除1个), 并返回 被删除的元素

8. shift()
在数组开始添加一个或多个元素,并返回新数组长度

9. unshift()
在数组开始删除一个元素(删且只删除1个),并返回 被删除的元素

10. toString()和toLocaleString()
将数组的每个元素转化为字符串,并且输入用逗号分隔的字符串列表。功能类似join();

11. indexOf()和lastIndexOf()
indexOf() 两个参数:要查找的项和(可选的)表示查找起点位置的索引。其中, 从数组的开头(位置 0)开始向后查找。没找到返回-1. 返回查找项的索引值
lastIndexOf() 从数组的末尾开始向前查找。返回查找项的索引值(索引值永远是正序的索引值),没找到返回-1

A. sort();
默认情况下sort()方法没有传比较函数的话,默认按字母升序,如果不是元素不是字符串的话,会调用toString()方法将元素转化为字符串的Unicode(万国码)位点,然后再比较字符。所以用默认方法排序数据是有问题的。

var arr = [20,10,2,1,3];
arr.sort();// [1, 10, 2, 20, 3]
arr.sort(function(a,b){
  return a-b;    //升序
}); //[1, 2, 3, 10, 20]
arr.sort(function(a,b){
  return b-a;    //降序
}); //[20,10,3,2,1]

B. forEach()
从头至尾遍历数组,为每个元素调用指定函数
输入为一个待遍历函数,函数的参数依次为:数组元素、元素的索引、数组本身

C. map()
调用的数组的每一个元素传递给指定的函数,并返回一个新数组 ,不修改原数组。

var arr = [2,3,4,5,6];
var bb= arr.map(function(x){
  return x*x;
});
console.log(bb); // [4, 9, 16, 25, 36]

D. filter()
过滤功能,数组中的每一项运行给定函数,返回满足过滤条件组成的数组。
可以巧妙的用来去重

var a = [1,2,3,4,5,6,3,1];
a.filter(function(v,i,self){
  return self.indexOf(v) == i;
});
//[1, 2, 3, 4, 5, 6]

E. every()和some()
every() 判断数组中每一项都是否满足条件,只有所有项都满足条件,才会返回true。
some() 判断数组中是否存在满足条件的项,只要有一项满足条件,就会返回true。

var arr = [1, 2, 3, 4, 5, 6];
arr.every(x=>x>0);//return true;
arr.every(x=>x>5);//return false;
arr.some(x=>x>5);//return true;

F. reduce()和reduceRight()
reduce() 两个参数:函数和递归的初始值。从数组的第一项开始,逐个遍历到最后
reduceRight() 从数组的最后一项开始,向前遍历到第一项

//可以用reduce快速求数组之和
var arr=[1,2,3,4];
arr.reduce(function(a,b){
  return a+b;
}); //10

G. 创建数组

// 字面量方式:
// 这个方法也是我们最常用的,在初始化数组的时候 相当方便
var a = [3, 11, 8]; // [3,11,8];
// 构造器:
// 实际上 new Array === Array,加不加new 一点影响都没有。
var a = Array(); // [] 
var a = Array(3); // [undefined,undefined,undefined]
var a = Array(3,11,8); // [ 3,11,8 ]

** H. Array.of()**
返回由所有参数值组成的数组

let a = Array.of(3, 11, 8); // [3,11,8]
let a = Array.of(3); // [3]

** I. Array.from()**
用于将两类对象转为真正的数组(不改变原对象,返回新的数组)

// 1. 对象拥有length属性
let obj = {0: 'a', 1: 'b', 2:'c', length: 3};
let arr = Array.from(obj); // ['a','b','c'];
// 2. 部署了 Iterator接口的数据结构 比如:字符串、Set、NodeList对象
let arr = Array.from('hello'); // ['h','e','l','l']
let arr = Array.from(new Set(['a','b'])); // ['a','b']

(2)小数转化为百分数

   (1) return Number(data.row['coverageRate'] * 100).toFixed(2) + '%';
   (2) return Math.round(data.row['coverageRate'] * 10000) / 100.0 + '%';

(3)vue列表渲染

1)数组更新检测

js的限制使得vue不能检测到数据的变动
(1)直接利用索引项设置一个数组项:vm.items[index]=newVaue
(2)修改数组长度的时候:vm.items.length=newLength

例如:

var vm = new Vue({
  data: {
    items: ['a', 'b', 'c']
  }
})
vm.items[1] = 'x' // 不是响应性的
vm.items.length = 2 // 不是响应性的

以下两种方式可以实现响应式的更新:

// Vue.set
Vue.set(vm.items, indexOfItem, newValue)
// Array.prototype.splice
vm.items.splice(indexOfItem, 1, newValue)

还可以使用以下方法

vm.$set(vm.items, indexOfItem, newValue)
vm.items.splice(newLength)

2)对象变更检测

对于已经创建的对象,vue不允许添加根级别的响应式式属性。但是,可以使用 Vue.set(object, propertyName, value) 方法向嵌套对象添加响应式属性。
例如:

var vm = new Vue({
  data: {
    userProfile: {
      name: 'Anika'
    }
  }
})

Vue.set(vm.userProfile, 'age', 27)
vm.$set(vm.userProfile, 'age', 27)

当需要为已有的对象赋予多个属性值的时候,要添加响应式的属性应该使用以下方式:

vm.userProfile = Object.assign({}, vm.userProfile, {
  age: 27,
  favoriteColor: 'Vue Green'
})
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值