资讯专栏INFORMATION COLUMN

js一些数组的操作。

codercao / 3041人阅读

摘要:返回值包含被删除项目的新数组,如果有的话。该参数可指定返回的数组的最大长度。返回值一个字符串数组。该数组是通过在指定的边界处将字符串分割成子串创建的。元素是通过指定的分隔符进行分隔的。。也是改变原数组,返回的是删除的值。

数组扩展运算符

含义:
扩展运算符是三个点(...);好比rest参数的逆运算,将一个数组转为用逗号分割的参数序列。

console.log(...[1,2,3]);
//1,2,3
console.log(1,...[2,3,4],5);
//1,2,3,4,5
[...document.querySelectorAll("div")]
//[
,
]

该运算符主要用于函数调用。

function pushs(array,...items){
  array.push(...items);
  return array;
}
console.log(pushs([1,2],...[4,5,6]));
//[1, 2, 4, 5, 6]

function add(x,y){
    return x+y;
}
const numbers = [4,38];
var b = add(...numbers);
//b=42

扩展运算符与正常的函数可以结合使用,非常灵活。

function f(v,w,x,y,z){}
const args = [0,1];
f(-1,...args,2,...[3]);

扩展运算符后面还可以放置表达式

const arr =[
    ...(x>0?["a"]:[]),
    "b",
]

如果扩展运算符后面是一个空数组,则不产生任何效果。

[...[],1]

注意:扩展运算符如果放在括号中,JavaScript引擎就会认为是函数调用,否则就会报错。

(...[1,2]);
console.log((...[1,2]))

上面两种情况都会报错,因为扩展运算符所在的括号不是函数调用,而console.log(...[1,2])就不会报错,因为这时是函数的调用。

替代函数的apply方法

//ES5的写法
function f(x,y,z){
    //...
}
var args = [0,1,2];
f.apply(null,args);
//ES6的写法
function f(x,y,z){
    //...
}
let args = [0,1,2];
f(...args);

下面是扩展运算符取代apply方法的一个实际的例子,应用Math.max方法,简化求出一个数组最大元素的写法。

// ES5 的写法
Math.max.apply(null, [14, 3, 77])

// ES6 的写法
Math.max(...[14, 3, 77])

// 等同于
Math.max(14, 3, 77);

另一个例子是通过push函数,将一个数组添加到另一个数组的尾部。

//ES5的写法
var arr1 = [0,1,2];
var arr2 = [3,4,5];
Array.prototype.push.apply(arr1,arr2);
//ES6的写法
let arr1 = [0,1,2];
let arr2 = [3,4,5];
arr1.push(...arr2);

下面是另一个例子。

//ES5
new (Date.bind.apply(Date,[null,2015,1,1]));
//ES6
new Date(...[2015,1,1])

扩展运算符的应用

(1)复制数组

const a1 = [1,2];
//写法一
const a2 = [...a1];
//写法二
const [...a2] = a1;
//上面的两种写法,a2都是a1的克隆,改变互相不影响。

(2)合并数组

const a1 = [{ foo: 1 }];
const a2 = [{ bar: 2 }];

const a3 = a1.concat(a2);
const a4 = [...a1, ...a2];

a3[0] === a1[0] // true
a4[0] === a1[0] // true
//上面代码中,a3和a4是用两种不同方法合并而成的新数组,但是它们的成员都是对原数组成员的引用,这就是浅拷贝。如果修改了原数组的成员,会同步反映到新数组。
(3)与解构赋值结合
扩展运算符可以与解构赋值结合起来,用于生成数组。

//ES5
a=list[0],rest=list.slice(1);
//ES6
[a,...rest] = list

const [first, ...rest] = [1, 2, 3, 4, 5];
first // 1
rest  // [2, 3, 4, 5]

const [first, ...rest] = [];
first // undefined
rest  // []

const [first, ...rest] = ["foo"];
first  // "foo"
rest   // []

如果将扩展运算符用于数组赋值,只能放在参数的最后一位,否则会报错。

const [...butLast, last] = [1, 2, 3, 4, 5];
// 报错

const [first, ...middle, last] = [1, 2, 3, 4, 5];
// 报错
如何从数组中按顺序取每5个元素为一组放到新数组中,最后不够5个也存为一个数组
//1.
var SplitArray = function(cont,arr){
    var newArr =[];
    var f;
    for(f=0;f
斐波那契数列
//1.使用generator函数和for...of实现
function*fibonaci(){
    let[prev,curr] = [0,1];
    for(;;){
        yield curr;
        [prev,curr] = [curr,prev+curr];
    }
}
for(let n of fibonaci()){
    if(n>1000)break;
    console.log(n);
}
//2.递归方法基础上进行尾调用优化:
function fb(n,res1=1,res2=1){
  if(n<=2){
    return res2;
  }else{
    return fb(n-1,res2,res1+res2);
  }
}
var a = fb(10);

//3.迭代
function fb(n){
  var res1=1;
  var res2=1;
  var sum = res2;
  for(var i=2;i
slice()和splice()区别

slice(start,end)
start:必需。规定从何处开始选取。如果是负数,那么它规定从数组尾部开始算起的位置。也就是说,-1指最后一个元素,-2指倒数第二个元素,以此类推。
end:可选。规定从何处结束选取。该参数是数组片段结束处的数组下标。如果没有指定该参数,那么切分的数组包含从start到数组结束的所有元素。如果这个参数是负数,那么它规定的是从数组尾部开始算起的元素。
返回一个新的数组,包含从start到end(不包括该元素)的arrayObject中的元素。
注意:该方法并不会修改数组,而是返回一个子数组。如果想删除数组中的一段元素,应该使用方法Array.splice().

var a =[1,2,3,4,5,6]
//如果不传入参数二,那么将从参数一的索引位置开始截取,一直到数组尾
console.log(a.slice(0,3))//1,2,3
console.log(a.slice(2))//3,4,5,6
//如果两个参数中的任何一个是负数,array.length会和它们相加,试图让它们成为非负数,举例说明:
//当只传入一个参数,且是负数时,length会与参数相加,然后再截取
//当只传入一个参数,是负数时,并且参数的绝对值大于数组length时,会截取整个数组
console.log(a.slice(-1))//6
console.log(a.slice(-2))//5,6
console.log(a.slice(-3))//4,5,6
//当传入两个参数一正一负时,length也会先于负数相加后,再截取
console.log(a.slice(-3,6))//4,5,6
console.log(a.slice(-3,5))//4,5
console.log(a)//1,2,3,4,5,6
//当传入一个参数,大于length时,将返回一个空数组

splice()方法向/从数组中添加/删除项目,然后返回被删除的项目。
该方法会改变原始数组。
arrayObject.splice(index,howmany,item1,...,itemX)
index:必需,整数,规定添加/删除项目的位置,使用负数可从数组结尾处规定位置。
howmany:必需。要删除的项目数量。如果设置为0,则不会删除项目。
item1,...,itemX:可选。向数组添加的新项目。
返回值:包含被删除项目的新数组,如果有的话。

var arr = ["a","b","c","d","e"];
// console.log(arr.splice(1,2));//[b,c]
// console.log(arr);//[a,d,e]
// console.log(arr.splice(1,2,"bb","cc"));//[b,c]
// console.log(arr)//[a,bb,cc,d,e]
console.log(arr.splice(1,2,"bb","cc","dd","ee"));//[b,c]
console.log(arr)//["a", "bb", "cc", "dd", "ee", "d", "e"]
split与join

split()方法用于把一个字符串分割成字符串数组。stringObject.split(separator,howmany)。
separator:必需。字符串或正则表达式,从该参数指定的地方分割stringObject。
howmany:可选。该参数可指定返回的数组的最大长度。如果设置了参数,返回的子串不会多于这个参数指定的数组。如果没有设置该参数,整个字符串都会被分割,不考虑它的长度。
返回值:一个字符串数组。该数组是通过在separator指定的边界处将字符串stringObject分割成子串创建的。返回的数组中的字串不包括separator自身。
但是,如果separator是包含子表达式的正则表达式,那么返回的数组中包括与这些子表达式匹配的字串(但不包括与整个正则表达式匹配的文本)
join()方法用于把数组中的所有元素放入一个字符串。元素是通过指定的分隔符进行分隔的。
arrayObject.join(separator)。
separator:可选。指定要使用的分隔符。如果省略该参数,则使用逗号作为分隔符。
返回值:返回一个字符串。该字符串是通过把arrayObject的每个元素转换为字符串,然后把这些字符串链接起来,在两个元素之间插入separator字符串而生成的。

map遍历

array.map(callback,[thisObject]);
map方法的作用不难理解,映射,也就是原数组被映射成对应新数组。下面这个例子是数值项求平方:

var data = [1,2,3,4];
var arrayOfSquares = data.map(function(item){return item*item});
alert(arrayOfSquares)//1,4,9,16

callback需要有return值,如果没有,就像下面这样:

var data = [1,2,3,4];
var arrayOfSquares = data.map(function(){});
arrayOfSquares.forEach(console.log());
concat()

Array.concat(),创建并返回一个新数组。

var a = [1,2,3];
var b = a.concat(4,5);
var c = a.concat([4,5]);
console.log(a);//[1,2,3];
console.log(b);//[1,2,3,4,5];
console.log(c);//[1,2,3,4,5];

这个方法还可以用来复制数组。

var a = [1,2,3];
var b = a.concat();
console.log(a)//[1,2,3];
console.log(b)//[1,2,3];
push()方法与pop()方法

push()方法在数组的尾部添加一个或多个元素,并返回数组的新长度。注意的是,改变的是原数组的值,返回的是新数组的长度。
pop()方法删除数组的最后一个元素,并返回它的删除值。也是改变原数组,返回的是删除的值。

unshift()方法与shift()方法

unshift()方法类似于push()不同的是,它是在数组的头部添加,其它都一样。
shift()方法则类比pop()方法。

toString()和toLocaleString()

toString()方法将每个元素转化为字符串,类似于不传参数的join()方法。
toLocaleString()方法是toString()的本地化版本。

forEach()方法,从头至尾遍历数组,为每个元素调用指定的函数
var a =[1,2,3,4,5];
var sum = 0;
a.forEach(function(value){
    sum+=value;
})
console.log(sum);//sum = 15;
filter()方法,返回的是调用数组的一个子集
var a = [1,2,3,4,5];
var b = a.filter(function(value){
    return value > 3;
})
console.log(b)//返回[4,5];
注意:如果使用map()方法,返回的是[false,false,false,true,true]
filter()会跳过悉数数组中缺少的元素,它的返回数组总是稠密的。所以可以用以下方法来压缩稀疏数组的空缺。
var a = [1,2,,,5];
var b = a.filter(function(value){
    return true;
})
console.log(b)//返回[1,2,5]
every()和some()

every()方法是只有数组中所有元素都满足某个条件才会返回true;some()方法是只要有满足条件的值,就返回true。

var a = [1,2,3,4,5];
a.every(function(value){
    return value <10;
})//true
a.every(function (value){
    return value%2 ===0;
})//false
indexOf()和lastIndexOf()

这两个方法都是用来搜索整个数组中具有给定值的元素,返回找到的第一个元素的索引,如果没找到,则返回-1.区别在于indexOf()从头至尾搜索,而后者则是反向搜索。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/99567.html

相关文章

  • JavaScript 实现数组更多高阶函数

    摘要:实现数组更多的高阶函数吾辈的博客原文场景虽说人人平等,但有些人更加平等。若是有一篇适合萌新阅读的自己实现数组更多操作的文章,情况或许会发生一些变化。类似于的初始值,但它是一个函数,避免初始值在所有分组中进行累加。 JavaScript 实现数组更多的高阶函数 吾辈的博客原文: https://blog.rxliuli.com/p/fc... 场景 虽说人人平等,但有些人更加平等。 为...

    aervon 评论0 收藏0
  • Vue.js 实践(2):实现多条件筛选、搜索、排序及分页表格功能

    摘要:基础布局的中主要为部分,分别是用于搜索筛选和分页的表单控件用于排序表格的表头以及用于展示数据的。这也是前瞻发布之后,提出废弃部分功能后许多人反应较为强烈的原因。 与上周的第一篇实践教程一样,在这篇文章中,我将继续从一种常见的功能——表格入手,展示Vue.js中的一些优雅特性。同时也将对filter功能与computed属性进行对比,说明各自的适用场景,也为vue2.0版本中即将删除的部...

    Profeel 评论0 收藏0
  • Vue.js 实践(2):实现多条件筛选、搜索、排序及分页表格功能

    摘要:基础布局的中主要为部分,分别是用于搜索筛选和分页的表单控件用于排序表格的表头以及用于展示数据的。这也是前瞻发布之后,提出废弃部分功能后许多人反应较为强烈的原因。 与上周的第一篇实践教程一样,在这篇文章中,我将继续从一种常见的功能——表格入手,展示Vue.js中的一些优雅特性。同时也将对filter功能与computed属性进行对比,说明各自的适用场景,也为vue2.0版本中即将删除的部...

    ChanceWong 评论0 收藏0
  • 深入探究immutable.js实现机制(一)

    摘要:本文会集合多方资料以及我自己的一些理解,深入一些探究实现机制。位分区实际上是数字分区的一个子集,所有以的整数次幂,,,,为基数的数字分区前缀树,都可以转为位分区。其实举个例子最好理解比如数字的二进制形式是,这是一个位的二进制数。 Immutable.js 采用了持久化数据结构和结构共享,保证每一个对象都是不可变的,任何添加、修改、删除等操作都会生成一个新的对象,且通过结构共享等方式大幅...

    zhangfaliang 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<