js数组-js数组外包-北京js数组外包

搜 索

Search:js数组


js代码 es6数组的扩展,js数组的扩展

ES6 数组的扩展 Array.from() Array.from方法用于将两类对象转为真正的数组:类似数组的对象(array-like object)和可遍历(iterable)的对象(包括ES6 数组的扩展Array.from()Array.from方法用于将两类对象转为真正的数组:类似数组的对象(array-like object)和可遍历(iterable)的对象(包括ES6新增的数据结构Set和Map)。下面是一个类似数组的对象,Array.from将它转为真正的数组。let arrayLike = {'0': 'a','1': 'b','2': 'c',length: 3};// ES5的写法var arr1 = [].slice.call(arrayLike); // ['a', 'b', 'c']// ES6的写法let arr2 = Array.from(arrayLike); // ['a', 'b', 'c']实际应用中,常见的类似数组的对象是DOM操作返回的NodeList集合,以及函数内部的arguments对象。Array.from都可以将它们转为真正的数组。// NodeList对象let ps = document.querySelectorAll('p');Array.from(ps).forEach(function (p) {console.log(p);});// arguments对象function foo() {var args = Array.from(arguments);// ...}上面代码中,querySelectorAll方法返回的是一个类似数组的对象,只有将这个对象转为真正的数组,才能使用forEach方法。只要是部署了Iterator接口的数据结构,Array.from都能将其转为数组。Array.from('hello')// ['h', 'e', 'l', 'l', 'o']let namesSet = new Set(['a', 'b'])Array.from(namesSet) // ['a', 'b']上面代码中,字符串和Set结构都具有Iterator接口,因此可以被Array.from转为真正的数组。如果参数是一个真正的数组,Array.from会返回一个一模一样的新数组。Array.from([1, 2, 3])// [1, 2, 3]值得提醒的是,扩展运算符(...)也可以将某些数据结构转为数组。// arguments对象function foo() {var args = [...arguments];}// NodeList对象[...document.querySelectorAll('div')]扩展运算符背后调用的是遍历器接口(Symbol.iterator),如果一个对象没有部署这个接口,就无法转换。Array.from方法则是还支持类似数组的对象。所谓类似数组的对象,本质特征只有一点,即必须有length属性。因此,任何有length属性的对象,都可以通过Array.from方法转为数组,而此时扩展运算符就无法转换。Array.from({ length: 3 });// [ undefined, undefined, undefined ]上面代码中,Array.from返回了一个具有三个成员的数组,每个位置的值都是undefined。扩展运算符转换不了这个对象。对于还没有部署该方法的浏览器,可以用Array.prototype.slice方法替代。const toArray = (() =>Array.from ? Array.from : obj => [].slice.call(obj))();Array.from还可以接受第二个参数,作用类似于数组的map方法,用来对每个元素进行处理,将处理后的值放入返回的数组。Array.from(arrayLike, x => x * x);// 等同于Array.from(arrayLike).map(x => x * x);Array.from([1, 2, 3], (x) => x * x)// [1, 4, 9]下面的例子是取出一组DOM节点的文本内容。let spans = document.querySelectorAll('span.name');// map()let names1 = Array.prototype.map.call(spans, s => s.textContent);// Array.from()let names2 = Array.from(spans, s => s.textContent)下面的例子将数组中布尔值为false的成员转为0。Array.from([1, , 2, , 3], (n) => n || 0)// [1, 0, 2, 0, 3]另一个例子是返回各种数据的类型。function typesOf () {return Array.from(arguments, value => typeof value)}typesOf(null, [], NaN)// ['object', 'object', 'number']如果map函数里面用到了this关键字,还可以传入Array.from的第三个参数,用来绑定this。Array.from()可以将各种值转为真正的数组,并且还提供map功能。这实际上意味着,只要有一个原始的数据结构,你就可以先对它的值进行处理,然后转成规范的数组结构,进而就可以使用数量众多的数组方法。Array.from({ length: 2 }, () => 'jack')// ['jack', 'jack']上面代码中,Array.from的第一个参数指定了第二个参数运行的次数。这种特性可以让该方法的用法变得非常灵活。Array.from()的另一个应用是,将字符串转为数组,然后返回字符串的长度。因为它能正确处理各种Unicode字符,可以避免JavaScript将大于\uFFFF的Unicode字符,算作两个字符的bug。function countSymbols(string) {return Array.from(string).length;}Array.of()Array.of方法用于将一组值,转换为数组。Array.of(3, 11, 8) // [3,11,8]Array.of(3) // [3]Array.of(3).length // 1这个方法的主要目的,是弥补数组构造函数Array()的不足。因为参数个数的不同,会导致Array()的行为有差异。Array() // []Array(3) // [, , ,]Array(3, 11, 8) // [3, 11, 8]上面代码中,Array方法没有参数、一个参数、三个参数时,返回结果都不一样。只有当参数个数不少于2个时,Array()才会返回由参数组成的新数组。参数个数只有一个时,实际上是指定数组的长度。Array.of基本上可以用来替代Array()或new Array(),并且不存在由于参数不同而导致的重载。它的行为非常统一。Array.of() // []Array.of(undefined) // [undefined]Array.of(1) // [1]Array.of(1, 2) // [1, 2]Array.of总是返回参数值组成的数组。如果没有参数,就返回一个空数组。Array.of方法可以用下面的代码模拟实现。function ArrayOf(){return [].slice.call(arguments);}数组实例的copyWithin()数组实例的copyWithin方法,在当前数组内部,将指定位置的成员复制到其他位置(会覆盖原有成员),然后返回当前数组。也就是说,使用这个方法,会修改当前数组。Array.prototype.copyWithin(target, start = 0, end = this.length)它接受三个参数。target(必需):从该位置开始替换数据。start(可选):从该位置开始读取数据,默认为0。如果为负值,表示倒数。end(可选):到该位置前停止读取数据,默认等于数组长度。如果为负值,表示倒数。这三个参数都应该是数值,如果不是,会自动转为数值。[1, 2, 3, 4, 5].copyWithin(0, 3)// [4, 5, 3, 4, 5]上面代码表示将从3号位直到数组结束的成员(4和5),复制到从0号位开始的位置,结果覆盖了原来的1和2。下面是更多例子。// 将3号位复制到0号位[1, 2, 3, 4, 5].copyWithin(0, 3, 4)// [4, 2, 3, 4, 5]// -2相当于3号位,-1相当于4号位[1, 2, 3, 4, 5].copyWithin(0, -2, -1)// [4, 2, 3, 4, 5]// 将3号位复制到0号位[].copyWithin.call({length: 5, 3: 1}, 0, 3)// {0: 1, 3: 1, length: 5}// 将2号位到数组结束,复制到0号位var i32a = new Int32Array([1, 2, 3, 4, 5]);i32a.copyWithin(0, 2);// Int32Array [3, 4, 5, 4, 5]// 对于没有部署TypedArray的copyWithin方法的平台// 需要采用下面的写法[].copyWithin.call(new Int32Array([1, 2, 3, 4, 5]), 0, 3, 4);// Int32Array [4, 2, 3, 4, 5]数组实例的find()和findIndex()数组实例的find方法,用于找出第一个符合条件的数组成员。它的参数是一个回调函数,所有数组成员依次执行该回调函数,直到找出第一个返回值为true的成员,然后返回该成员。如果没有符合条件的成员,则返回undefined。[1, 4, -5, 10].find((n) => n < 0)// -5上面代码找出数组中第一个小于0的成员。[1, 5, 10, 15].find(function(value, index, arr) {return value > 9;}) // 10上面代码中,find方法的回调函数可以接受三个参数,依次为当前的值、当前的位置和原数组。数组实例的findIndex方法的用法与find方法非常类似,返回第一个符合条件的数组成员的位置,如果所有成员都不符合条件,则返回-1。[1, 5, 10, 15].findIndex(function(value, index, arr) {return value > 9;}) // 2这两个方法都可以接受第二个参数,用来绑定回调函数的this对象。另外,这两个方法都可以发现NaN,弥补了数组的IndexOf方法的不足。[NaN].indexOf(NaN)// -1[NaN].findIndex(y => Object.is(NaN, y))// 0上面代码中,indexOf方法无法识别数组的NaN成员,但是findIndex方法可以借助Object.is方法做到。数组实例的fill()fill方法使用给定值,填充一个数组。['a', 'b', 'c'].fill(7)// [7, 7, 7]new Array(3).fill(7)// [7, 7, 7]上面代码表明,fill方法用于空数组的初始化非常方便。数组中已有的元素,会被全部抹去。fill方法还可以接受第二个和第三个参数,用于指定填充的起始位置和结束位置。['a', 'b', 'c'].fill(7, 1, 2)// ['a', 7, 'c']上面代码表示,fill方法从1号位开始,向原数组填充7,到2号位之前结束。数组实例的entries(),keys()和values()ES6提供三个新的方法‡‡entries(),keys()和values()‡‡用于遍历数组。它们都返回一个遍历器对象(详见《Iterator》一章),可以用for...of循环进行遍历,唯一的区别是keys()是对键名的遍历、values()是对键值的遍历,entries()是对键值对的遍历。for (let index of ['a', 'b'].keys()) {console.log(index);}// 0// 1for (let elem of ['a', 'b'].values()) {console.log(elem);}// 'a'// 'b'for (let [index, elem] of ['a', 'b'].entries()) {console.log(index, elem);}// 0 "a"// 1 "b"如果不使用for...of循环,可以手动调用遍历器对象的next方法,进行遍历。let letter = ['a', 'b', 'c'];let entries = letter.entries();console.log(entries.next().value); //
标签:

jsjs数组降维的实现Array.prototype.concat.apply([], arr)js大全

把多维数组(尤其是二维数组)转化为一维数组是业务开发中的常用逻辑,最近跟着黄轶老师学习Vue2.6.1.1版本源码时,看到源码对二维数组降维的代码,所以这里来写一篇,记录一下,加强印象二维数组降为一维把多维数组(尤其是二维数组)转化为一维数组是业务开发中的常用逻辑,最近跟着黄轶老师学习Vue2.6.1.1版本源码时,看到源码对二维数组降维的代码,所以这里来写一篇,记录一下,加强印象二维数组降为一维数组二维数组降为一维数组二维数组降为一维数组循环降维let children = [1, 2, 3, [4, 5, 6], 7, 8, [9, 10]];function simpleNormalizeChildren(children) { let reduce = []; for (let i = 0; i if (Array.isArray(children[i])) {for (let j = 0; j reduce.push(children[i][j]);}} else {reduce.push(children[i]);} } return reduce;}simpleNormalizeChildren(children) // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]let children = [1, 2, 3, [4, 5, 6], 7, 8, [9, 10]];function simpleNormalizeChildren(children) { let reduce = []; for (let i = 0; i if (Array.isArray(children[i])) {for (let j = 0; j reduce.push(children[i][j]);}} else {reduce.push(children[i]);} } return reduce;}simpleNormalizeChildren(children) // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]此方法思路简单,利用双重循环遍历二维数组中的每个元素并放到新数组中。concat降维concat降维concat降维MDN上对于concat的介绍“concat creates a new array consisting of the elements in the object on which it is called, followed in order by, for each argument, the elements of that argument (if the argument is an array) or the argument itself (if the argument is not an array).”“concat creates a new array consisting of the elements in the object on which it is called, followed in order by, for each argument, the elements of that argument (if the argument is an array) or the argument itself (if the argument is not an array).”concatconcat如果concat方法的参数是一个元素,该元素会被直接插入到新数组中;如果参数是一个数组,该数组的各个元素将被插入到新数组中;将该特性应用到代码中:let children = [1, 2, 3, [4, 5, 6], 7, 8, [9, 10]];function simpleNormalizeChildren(children) { let reduce = []; for (let i = 0; i reduce = reduce.concat(children[i]); } return reduce;}simpleNormalizeChildren(children) // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]let children = [1, 2, 3, [4, 5, 6], 7, 8, [9, 10]];function simpleNormalizeChildren(children) { let reduce = []; for (let i = 0; i reduce = reduce.concat(children[i]); } return reduce;}simpleNormalizeChildren(children) // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]children 的元素如果是一个数组,作为concat方法的参数,数组中的每一个子元素会被独立插入进新数组。利用concat方法,我们将双重循环简化为了单重循环。apply和concat降维apply和concat降维apply和concat降维MDN上对于apply方法的介绍“The apply() method calls a function with a given this value and arguments provided as an array.”“The apply() method calls a function with a given this value and arguments provided as an array.”applyapplyapply方法会调用一个函数,apply方法的第一个参数会作为被调用函数的this值,apply方法的第二个参数(一个数组,或类数组的对象)会作为被调用对象的arguments值,也就是说该数组的各个元素将会依次成为被调用函数的各个参数;将该特性应用到代码中:let children = [1, 2, 3, [4, 5, 6], 7, 8, [9, 10]];function simpleNormalizeChildren(children) { return Array.prototype.concat.apply([], children);}simpleNormalizeChildren(children) // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]let children = [1, 2, 3, [4, 5, 6], 7, 8, [9, 10]];function simpleNormalizeChildren(children) { return Array.prototype.concat.apply([], children);}simpleNormalizeChildren(children) // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]children作为apply方法的第二个参数,本身是一个数组,数组中的每一个元素(还是数组,即二维数组的第二维)会被作为参数依次传入到concat中,效果等同于[].concat(1, 2, 3, [4, 5, 6], 7, 8, [9, 10])。利用apply方法,我们将单重循环优化为了一行代码Vue2.6.11版本源码降维Vue2.6.11版本源码降维Vue2.6.11版本源码降维let children = [1, 2, 3, [4, 5, 6], 7, 8, [9, 10]];// :any 可以去掉 这里是Vue通过Flow指定传入的参数类型可以是任意类型function simpleNormalizeChildren(children: any) { for (let i = 0; i if (Array.isArray(children[i])) {return Array.prototype.concat.apply([], children);} } return children;}simpleNormalizeChildren(children); // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]let children = [1, 2, 3, [4, 5, 6], 7, 8, [9, 10]];// :any 可以去掉 这里是Vue通过Flow指定传入的参数类型可以是任意类型function simpleNormalizeChildren(children: any) { for (let i = 0; i if (Array.isArray(children[i])) {return Array.prototype.concat.apply([], children);} } return children;}simpleNormalizeChildren(children); // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]多维数组降为一维数组多维数组降为一维数组多维数组降为一维数组递归降维递归函数就是在函数体内调用自己;递归函数的使用要注意函数终止条件避免死循环;// 多维数组let children = [1, [2,3], [4, [5, 6, [7, 8]]], [9, 10]];function simpleNormalizeChildren(children) { for (let i = 0; i if (Array.isArray(children[i])) {children = Array.prototype.concat.apply([], children);for(let j =0; jsimpleNormalizeChildren(children)}} } return children;}simpleNormalizeChildren(children); // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]// 多维数组let children = [1, [2,3], [4, [5, 6, [7, 8]]], [9, 10]];function simpleNormalizeChildren(children) { for (let i = 0; i if (Array.isArray(children[i])) {children = Array.prototype.concat.apply([], children);for(let j =0; jsimpleNormalizeChildren(children)}} } return children;}simpleNormalizeChildren(children); // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
标签:

jsjs数组的常用10种方法详解js大全

数组在JavaScript中经常使用,如何对数组进行增删改非常重要,下面为数组的常用方法:在数组末尾插入元素在数组末尾插入元素arr.push(value),在数组的末尾添加一个或多个元素,并数组在JavaScript中经常使用,如何对数组进行增删改非常重要,下面为数组的常用方法:在数组末尾插入元素在数组末尾插入元素arr.push(value),在数组的末尾添加一个或多个元素,并返回数组的新长度。例如:let arr=[1,2,3,4,5]var longth=arr.push(6,7);console.log(arr, longth);let arr=[1,2,3,4,5]var longth=arr.push(6,7);console.log(arr, longth);数组的arr的值变为arr[1,2,3,4,5,6,7];length接收返回的是修改后数组的长度7;删除数组末尾的元素删除数组末尾的元素arr.pop()删除索引值最大的元素,并返回被删除的元素。let arr=[1,2,3,4,5]var delElement=arr.pop();console.log(arr, delElement);let arr=[1,2,3,4,5]var delElement=arr.pop();console.log(arr, delElement);arr的值为[1,2,3,4] ,delElement的值为5arr.pop()的与arr.length--的效果一样,但arr.length--没有返回值;在数组的头部插入元素在数组的头部插入元素unshift(value);在数组的头部添加一个或多个元素,并返回数组的新长度let arr=[1,2,3,4,5]var length= unshift(0);console.log(arr,length);//arr的值为[0,1,2,3,4,5];length的值为更改后数组的长度6;let arr=[1,2,3,4,5]var length= unshift(0);console.log(arr,length);//arr的值为[0,1,2,3,4,5];length的值为更改后数组的长度6;删除数组的头部元素删除数组的头部元素shift();删除索引为0的元素,并返回删除的元素let arr=[1,2,3,4,5]var delElement= unshift();console.log(arr, delElement);let arr=[1,2,3,4,5]var delElement= unshift();console.log(arr, delElement);arr的值为[2,3,4,5];delElement的值为被删除的元素1;数组和数组(或元素)的合并数组和数组(或元素)的合并concat()合并数组或元素,返回新的数组,原数组不会改变let arr=[1,2,3,4,5]let newArr=arr.concat([6,7,8],9,10);console.log(newArr,arr);let arr=[1,2,3,4,5]let newArr=arr.concat([6,7,8],9,10);console.log(newArr,arr);newArr的值为[1,2,3,4,5,6,7,8,9,10];arr的值还是原来的[1,2,3,4,5];concat()还可以复制一个新数组;let copyArr=arr.concat();//copyArr的值和arr的相同在数组中添加删除或替换元素在数组中添加删除或替换元素splice();在任意位置添加或删除元素,返回删除或被替换的值,如果没有被删除或替换则返回空数组;splice()方法会修改原数组的值;只有一个值时,从当前位置删除到数组末尾let arr=[1,2,3,4,5];let num1=arr.splice(1)console.log(num1;arr)//num=[2,3,4,5];arr=[1];let arr=[1,2,3,4,5];let num1=arr.splice(1)console.log(num1;arr)//num=[2,3,4,5];arr=[1];有两个值时,第一个值为删除的位置,第二个值为删除的个数;let arr=[1,2,3,4,5];let num1=arr.splice(2,3)//删除从索引值2开始的3个元素console.log(num1;arr);// num1=[3,4,5],arr=[1,2]let arr=[1,2,3,4,5];let num1=arr.splice(2,3)//删除从索引值2开始的3个元素console.log(num1;arr);// num1=[3,4,5],arr=[1,2]有三个或者多个值时,第一个值为插入元素的位置,第二个值为替换的个数,后面的值都为插入的新元素;let arr=[1,2,3,4,5];let num2=arr.splice(2,1,6,7,8);//从索引值2开始替换掉1个元素,并且插入6,7,8//如果第二个值为0,则不替换,直接插入6,7,8;console.log(num2;arr);//被替换的值num2=[3]; arr=[1,2,6,7,8,4,5]let arr=[1,2,3,4,5];let num2=arr.splice(2,1,6,7,8);//从索引值2开始替换掉1个元素,并且插入6,7,8//如果第二个值为0,则不替换,直接插入6,7,8;console.log(num2;arr);//被替换的值num2=[3]; arr=[1,2,6,7,8,4,5]截取复制数组指定位置的内容截取复制数组指定位置的内容slice(开始位置,结束位置);第二个参数不写默认到尾部,只能从前往后截取;返回的值为截取到的内容形成的新数组;let copyArr=arr.slice(); // slice()或者slice(0)都可以复制数组;let arr=[1,2,3,4,5];let newArr=arr.slice(1,3);//截取索引1到索引3(不包括3)的值;console.log(newArr,arr);//newArr=[2,3];arr=[1,2,3,4,5];let copyArr=arr.slice(); // slice()或者slice(0)都可以复制数组;let arr=[1,2,3,4,5];let newArr=arr.slice(1,3);//截取索引1到索引3(不包括3)的值;console.log(newArr,arr);//newArr=[2,3];arr=[1,2,3,4,5];slice()方法不会更改到原数组的值指定字符连接字符串指定字符连接字符串join();数组的每个元素以指定的字符连接形成新字符串返回;let arr=[1,2,3,4,5];let newArr=arr.join()//默认用逗号连接console.log(newArr);//newArr=1,2,3,4,5;//如果连接符为空字符串,则会无缝连接console.log(arr.join(“”));//输出为12345;let arr=[1,2,3,4,5];let newArr=arr.join()//默认用逗号连接console.log(newArr);//newArr=1,2,3,4,5;//如果连接符为空字符串,则会无缝连接console.log(arr.join(“”));//输出为12345;将数组进行排序将数组进行排序sort()将数组进行排序(升序),返回新数组,原数组也会改变;let arr=[2,3,5,1,4];let newArr=arr.sort();console.log(newArr,arr);//newArr=[1,2,3,4,5]; arr r=[1,2,3,4,5]let arr=[2,3,5,1,4];let newArr=arr.sort();console.log(newArr,arr);//newArr=[1,2,3,4,5]; arr r=[1,2,3,4,5]将数组进行倒序将数组进行倒序reverse();可以将数组进行倒序,并返回新数组,原数组也会随之改变;let arr=[1,2,3,4,5];let newArr=arr. reverse();console.log(newArr,arr);//newArr=[5,4,3,2,1]; arr=[5,4,3,2,1];let arr=[1,2,3,4,5];let newArr=arr. reverse();console.log(newArr,arr);//newArr=[5,4,3,2,1]; arr=[5,4,3,2,1];综上为数组的常用方法!以上就是本文的全部内容,希望对大家的学习有所帮助。
标签:

jsjs数组reduce()方法原理及使用技巧解析js大全

1、语法1、语法1、语法arr.reduce(callback,[initialValue])arr.reduce(callback,[initialValue])reduce 为数组1、语法1、语法1、语法arr.reduce(callback,[initialValue])arr.reduce(callback,[initialValue])reduce 为数组中的每一个元素依次执行回调函数,不包括数组中被删除或从未被赋值的元素,接受四个参数:初始值(或者上一次回调函数的返回值),当前元素值,当前索引,调用 reduce 的数组。callback (执行数组中每个值的函数,包含四个参数)1、previousValue (上一次调用回调返回的值,或者是提供的初始值(initialValue))2、currentValue (数组中当前被处理的元素)3、index (当前元素在数组中的索引)4、array (调用 reduce 的数组)initialValue (作为第一次调用 callback 的第一个参数。)如果没有提供initialValue,reduce 会从索引1的地方开始执行 callback 方法,跳过第一个索引。如果提供initialValue,从索引0开始。2、reduce的简单用法2、reduce的简单用法2、reduce的简单用法var arr = [1, 2, 3, 4];var sum = arr.reduce((x,y)=>x+y)var mul = arr.reduce((x,y)=>x*y)console.log( sum ); //求和,10console.log( mul ); //求乘积,24var arr = [1, 2, 3, 4];var sum = arr.reduce((x,y)=>x+y)var mul = arr.reduce((x,y)=>x*y)console.log( sum ); //求和,10console.log( mul ); //求乘积,241) 计算数组中每个元素出现的次数1) 计算数组中每个元素出现的次数let names = ['Alice', 'Bob', 'Tiff', 'Bruce', 'Alice'];let nameNum = names.reduce((pre,cur)=>{ if(cur in pre){pre[cur]++ }else{pre[cur] = 1 } return pre},{})console.log(nameNum); //{Alice: 2, Bob: 1, Tiff: 1, Bruce: 1}let names = ['Alice', 'Bob', 'Tiff', 'Bruce', 'Alice'];let nameNum = names.reduce((pre,cur)=>{ if(cur in pre){pre[cur]++ }else{pre[cur] = 1 } return pre},{})console.log(nameNum); //{Alice: 2, Bob: 1, Tiff: 1, Bruce: 1}2)数组去重2)数组去重let arr = [1,2,3,4,4,1]let newArr = arr.reduce((pre,cur)=>{if(!pre.includes(cur)){return pre.concat(cur)}else{return pre}},[])console.log(newArr);// [1, 2, 3, 4]let arr = [1,2,3,4,4,1]let newArr = arr.reduce((pre,cur)=>{if(!pre.includes(cur)){return pre.concat(cur)}else{return pre}},[])console.log(newArr);// [1, 2, 3, 4]3)将二维数组转化为一维3)将二维数组转化为一维let arr = [[0, 1], [2, 3], [4, 5]]let newArr = arr.reduce((pre,cur)=>{return pre.concat(cur)},[])console.log(newArr); // [0, 1, 2, 3, 4, 5]let arr = [[0, 1], [2, 3], [4, 5]]let newArr = arr.reduce((pre,cur)=>{return pre.concat(cur)},[])console.log(newArr); // [0, 1, 2, 3, 4, 5]4)将多维数组转化为一维4)将多维数组转化为一维let arr = [[0, 1], [2, 3], [4,[5,6,7]]]const newArr = function(arr){return arr.reduce((pre,cur)=>pre.concat(Array.isArray(cur)?newArr(cur):cur),[])}console.log(newArr(arr)); //[0, 1, 2, 3, 4, 5, 6, 7]let arr = [[0, 1], [2, 3], [4,[5,6,7]]]const newArr = function(arr){return arr.reduce((pre,cur)=>pre.concat(Array.isArray(cur)?newArr(cur):cur),[])}console.log(newArr(arr)); //[0, 1, 2, 3, 4, 5, 6, 7]5)对象里的属性求和5)对象里的属性求和var result = [{subject: 'math',score: 10},{subject: 'chinese',score: 20},{subject: 'english',score: 30}];var sum = result.reduce(function(prev, cur) {return cur.score + prev;}, 0);console.log(sum) //60var result = [{subject: 'math',score: 10},{subject: 'chinese',score: 20},{subject: 'english',score: 30}];var sum = result.reduce(function(prev, cur) {return cur.score + prev;}, 0);console.log(sum) //60以上就是本文的全部内容,希望对大家的学习有所帮助。
标签:

jsjs数组转字符串实现方法解析js大全

JavaScript 允许数组与字符串之间相互转换。其中 Array 方法对象定义了 3 个方法,可以把数组转换为字符串,如表所示。数组方法JavaScript 允许数组与字符串之间相互转换。其中 Array 方法对象定义了 3 个方法,可以把数组转换为字符串,如表所示。数组方法说明toString()将数组转换成一个字符串toLocalString()把数组转换成本地约定的字符串join()将数组元素连接起来以构建一个字符串数组方法说明数组方法说明数组方法说明toString()将数组转换成一个字符串toLocalString()把数组转换成本地约定的字符串join()将数组元素连接起来以构建一个字符串toString()将数组转换成一个字符串toString()将数组转换成一个字符串toLocalString()把数组转换成本地约定的字符串toLocalString()把数组转换成本地约定的字符串join()将数组元素连接起来以构建一个字符串join()将数组元素连接起来以构建一个字符串Array 对象的数组与字符串相互转换方法数组方法说明toString()将数组转换成一个字符串toLocalString()把数组转换成本地约定的字符串join()将数组元素连接起来以构建一个字符串示例1 toString()示例1 toString()下面使用 toString() 方法读取数组的值。数组中 toString() 方法能够把每个元素转换为字符串,然后以逗号连接输出显示。var a = [1,2,3,4,5,6,7,8,9,0]; //定义数组var s = a.toString(); //把数组转换为字符串console.log(s); //返回字符串“1,2,3,4,5,6,7,8,9,0”console.log(typeof s); //返回字符串string,说明是字符串类型var a = [1,2,3,4,5,6,7,8,9,0]; //定义数组var s = a.toString(); //把数组转换为字符串console.log(s); //返回字符串“1,2,3,4,5,6,7,8,9,0”console.log(typeof s); //返回字符串string,说明是字符串类型当数组用于字符串环境中时,JavaScript 会自动调用 toString() 方法将数组转换成字符串。在某些情况下,需要明确调用这个方法。var a = [1,2,3,4,5,6,7,8,9,0]; //定义数组var b = [1,2,3,4,5,6,7,8,9,0]; //定义数组var s = a + b; //数组连接操作console.log(s); //返回“1,2,3,4,5,6,7,8,9,01,2,3,4,5,6,7,8,9,0”console.log(typeof s); //返回字符串string,说明是字符串类型var a = [1,2,3,4,5,6,7,8,9,0]; //定义数组var b = [1,2,3,4,5,6,7,8,9,0]; //定义数组var s = a + b; //数组连接操作console.log(s); //返回“1,2,3,4,5,6,7,8,9,01,2,3,4,5,6,7,8,9,0”console.log(typeof s); //返回字符串string,说明是字符串类型toString() 在把数组转换成字符串时,首先要将数组的每个元素都转换为字符串。当每个元素都被转换为字符串时,才使用逗号进行分隔,以列表的形式输出这些字符串。var a = [1,[2,3],[4,5]],[6,[7,[8,9],0]]]; //定义多维数组var s = a.toString(); //把数组转换为字符串console.log(S); //返回字符串“1,2,3,4,5,6,7,8,9,0”var a = [1,[2,3],[4,5]],[6,[7,[8,9],0]]]; //定义多维数组var s = a.toString(); //把数组转换为字符串console.log(S); //返回字符串“1,2,3,4,5,6,7,8,9,0”其中数组 a 是一个多维数组,JavaScript 会以迭代的方式调用 toString() 方法把所有数组都转换为字符串。示例2 toLocaleString()示例2 toLocaleString()下面使用 toLocaleString() 方法读取数组的值。toLocaleString() 方法与 toString() 方法用法基本相同,主要区别在于 toLocaleString() 方法能够使用用户所在地区特定的分隔符把生成的字符串连接起来,形成一个字符串。var a = [1,2,3,4,5]; //定义数组var s = a.toLocaleString(); //把数组转换为本地字符串console.log(s); //返回字符串“1,2,3,4,5,6,7,8,9,0”var a = [1,2,3,4,5]; //定义数组var s = a.toLocaleString(); //把数组转换为本地字符串console.log(s); //返回字符串“1,2,3,4,5,6,7,8,9,0”在上面示例中,toLocaleString() 方法根据中国的使用习惯,先把数字转换为浮点数之后再执行字符串转换操作。示例3 join()示例3 join()下面使用 join() 方法可以把数组转换为字符串。join() 方法可以把数组转换为字符串,不过它可以指定分隔符。在调用 join() 方法时,可以传递一个参数作为分隔符来连接每个元素。如果省略参数,默认使用逗号作为分隔符,这时与 toString() 方法转换操作效果相同。var a = [1,2,3,4,5]; //定义数组var s = a.join("=="); //指定分隔符console.log(s); //返回字符串“1==2==3==4==5”var a = [1,2,3,4,5]; //定义数组var s = a.join("=="); //指定分隔符console.log(s); //返回字符串“1==2==3==4==5”示例4 split()示例4 split()下面使用 split() 方法把字符串转换为数组。split() 方法是 String 对象方法,与 join() 方法操作正好相反。该方法可以指定两个参数,第 1 个参数为分隔符,指定从哪儿进行分隔的标记;第 2 个参数指定要返回数组的长度。var s = "1==2== 3==4 ==5";var a = s.split("==");console.log(a);console.log(a.constructor == Array);var s = "1==2== 3==4 ==5";var a = s.split("==");console.log(a);console.log(a.constructor == Array);以上就是本文的全部内容,希望对大家的学习有所帮助。
标签:

JavaScript浅谈js数组splice删除某个元素爬坑

先来看下几个概念:// splice:返回从原始数组中删除的项(如果没有任何删除,则返回空数组)// 当指定2个参数时,表示删除// 当指定3个参数,且先来看下几个概念:// splice:返回从原始数组中删除的项(如果没有任何删除,则返回空数组)// 当指定2个参数时,表示删除// 当指定3个参数,且第2个参数为0时表示插入// 当指定3个参数,且第2个参数为1时表示替换// splice:返回从原始数组中删除的项(如果没有任何删除,则返回空数组)// 当指定2个参数时,表示删除// 当指定3个参数,且第2个参数为0时表示插入// 当指定3个参数,且第2个参数为1时表示替换本次就拿删除举例,本身我们想删除数组中的某个指定元素,我们需要知道它所在数组中的下标,我们可以用 数组.indexOf获取它所在的下标,然后拿splice删除这个元素。本身是没问题代码如下:var arr = ["张三","李四","王五","赵六"];// 删除王五arr.splice(arr.indexOf("王五"),1);var arr = ["张三","李四","王五","赵六"];// 删除王五arr.splice(arr.indexOf("王五"),1);但是。。。。。问题就来了。如果放到for循环中,比如循环数组,当某个条件成立的时候,我们需要删除某个指定的元素。但是循环中,i每次都是+1的,但是我们删除某个元素后,下标就变了,相应的位置发生变化,i的值加一后,就会跳过下一个元素。坑啊。。。所以,在删除某个元素的时候,我们手动把 i的值再减一,这样就会避免出现跳过某个元素的问题。例如:循环数组,当 DasOperation属性值等于 没变 的时候,从数组中删除这条数据,然后i-1// 删除没有变化的,不传递到后台for (let i = 0; i if (this.CurrJobData.Content[i].DasOperation === '没变') {this.CurrJobData.Content.splice(this.CurrJobData.Content.indexOf(this.CurrJobData.Content[i]), 1);i -= 1;// 必须对i减去1,否则后面的一个元素会被跳过去}}// 删除没有变化的,不传递到后台for (let i = 0; i if (this.CurrJobData.Content[i].DasOperation === '没变') {this.CurrJobData.Content.splice(this.CurrJobData.Content.indexOf(this.CurrJobData.Content[i]), 1);i -= 1;// 必须对i减去1,否则后面的一个元素会被跳过去}}好了,为避免小伙伴遇坑,贴出来,希望有帮助。 
标签: