您现在的位置是:网站首页> 编程资料编程资料

前端进阶JS数组高级用法大全教程示例_javascript技巧_

2023-05-24 230人已围观

简介 前端进阶JS数组高级用法大全教程示例_javascript技巧_

1.批量制造数据

一、创建新数组使用 for 循环批量 push 数据

function createData() { const data = []; for (let i = 0; i < 1000; i++) { data.push({ name: `name${i + 1}`, }); } return data; } const data = createData(); console.log(data); 

二、创建空数组,填充full,然后map

function createData() { // 如果不 fill 循环默认会跳过空值 return new Array(1000).fill(null).map((v, i) => ({ name: `name${i + 1}` })); } const data = createData(); console.log(data); 

三、Array.from 第二个初始化函数返回数据

function createData() { return Array.from({ length: 1000 }, (v, i) => ({ name: `name${i + 1}` })); } const data = createData(); console.log(data); 

2.数组合并去重

一、Set去重

const arr1 = [1, 2, 3]; const arr2 = [3, 4, 5]; console.log(new Set([...arr1, ...arr2])); 

二、for循环,indexOf判断是否存在

const arr1 = [1, 2, 3]; const arr2 = [3, 4, 5]; function mergeArray(arr1, arr2) { // 克隆 const cloneArr1 = arr1.slice(0); let v; for (let i = 0; i < arr2.length; i++) { v = arr2[i]; // 按位非,反转操作数的位,表象是对后面数字取负减一 // 当数组中不存在此项 indexOf 返回 -1 按位非得 0 不走 if 逻辑 // 如果两个数组都包含NaN,想要去重可使用includes if (~cloneArr1.indexOf(v)) { continue; } cloneArr1.push(v); } return cloneArr1; } console.log(mergeArray(arr1, arr2)); 

去重对象?

const arr1 = [{ id: 1 }, { id: 2 }, { id: 3 }]; const arr2 = [{ id: 3 }, { id: 4 }, { id: 5 }]; console.log(Array.from(new Set([...arr1, ...arr2]))); // [ { id: 1 }, { id: 2 }, { id: 3 }, { id: 3 }, { id: 4 }, { id: 5 } ] // 这样对象都是独立的引用,肯定无法去除属性相同的数据啦 

如果是相同引用呢?

const obj3 = { id: 3 }; const arr1 = [{ id: 1 }, { id: 2 }, obj3]; const arr2 = [obj3, { id: 4 }, { id: 5 }]; console.log(Array.from(new Set([...arr1, ...arr2]))); // 确实可以,但是你开发这样做? 

我们可以这样做

const arr1 = [{ id: 1 }, { id: 2 }, { id: 3 }]; const arr2 = [{ id: 3 }, { id: 4 }, { id: 5 }]; function mergeArray(arr1, arr2) { // 克隆 const cloneArr1 = arr1.slice(0); let v; for (let i = 0; i < arr2.length; i++) { v = arr2[i]; // 能找到相同 id 属性值的数据则进入判断 if (~cloneArr1.findIndex((el) => el.id === v.id)) { continue; } cloneArr1.push(v); } return cloneArr1; } console.log(mergeArray(arr1, arr2)); // [ { id: 1 }, { id: 2 }, { id: 3 }, { id: 4 }, { id: 5 } ] 

3.创建数组的几种方式

  • 字面量
// 字面量 const arr1 = [1, 2, 3, ...[4, 5, 6]]; // 1,2,3,4,5,6 const arr2 = [, , , , ,]; // [empty × 5] 
  • new Array(当参数只有一个且是数字时,new Array()表示数组的长度,其余参数则是数组的内容)
const arr3 = new Array(5); // [empty × 5] const arr4 = new Array(1, 2, 3); // 1,2,3 const arr5 = new Array("a"); // ["a"] 
  • Array.of(参数只用来作为数组中的内容)
const arr6 = Array.of(5); // [5] const arr7 = Array.of(1, 'abc', true); // [1, "abc", true] 
  • Array.from 可传入类数组和可遍历对象转换为真数组
  • (第一个参数传入对应类数组和可遍历对象,第二个函数参数则相当于对生成的数组做一次map)
  • 可遍历和类数组 ==> 数组、字符串、Set、Map、NodeList、HTMLCollection、arguments以及拥有 length 属性的任意对象
const arr8 = Array.from([1, 2, 3]); // [1,2,3] const arr9 = Array.from({ length: 3 }, (value, index) => { return index + 1; }); // [1,2,3] const arr10 = Array.from({ 0: "a", 1: "b", 2: "c", length: 3 }); // ["a", "b", "c"] 
  • 其他的很多可以返回数组的方法都算
// Array.prototype.slice const arr11 = Array.prototype.slice.call(document.querySelectorAll("div")); // [div, div, div....] // Array.prototype.concat const arr12 = Array.prototype.concat.call([], [1, 2, 3]); // [1, 2, 3] 

4.类数组

  • 是一个普通对象,不具备数组自带丰富的内建方法
  • key是以数字或者字符串数字组成
  • 必须有length属性
const arrayLike = { 0: "a", 1: "b", 2: "c", name: "test", length: 3, push: Array.prototype.push, //自己实现 splice: Array.prototype.splice, }; //由于类数组对象length属性声明了对象有多少个属性,所以可以使用for遍历对象属性: for (let i = 0; i < arrayLike.length; i++) { console.log(i + ":" + arrayLike[i]); } 

常见的类数组

  • arguments
function person(name, age, sex) { console.log("person arguments:", arguments); console.log("person type:", Object.prototype.toString.call(arguments)); } person("name", "age", "sex"); 

打印结果如下:

  • NodeList、HTMLCollection、DOMTokenList等
const nodeList = document.querySelectorAll("box"); console.log("querySelectorAll type:", Object.prototype.toString.call(nodeList)); const htmlCollection = document.getElementsByTagName("div"); console.log("getElementsByTagName type:", Object.prototype.toString.call(htmlCollection)); const DOMTokenList = document.querySelector("div").classList; console.log("classList:", DOMTokenList); 

  • 奇特:字符串(具备类数组的特性,但一般类数组指对象)
const str = "abc"; console.log(Object.keys(str)); // ['0', '1', '2'] console.log(Array.from(str)); // ['a', 'b', 'c'] 

判断是否是类数组

function isArrayLikeObject(arr) { // 不是对象直接返回 if (arr == null || typeof arr !== "object") return false; const lengthMaxValue = Math.pow(2, 53) - 1; // 是否有 length 属性 if (!Object.prototype.hasOwnProperty.call(arr, "length")) return false; // length 属性是否是number类型 if (typeof arr.length != "number") return false; //使用 isFinite() 判断是否在正常数字范围 if (!isFinite(arr.length)) return false; // 构造函数等于Array if (Array === arr.constructor) return false; // 长度有效值 if (arr.length >= 0 && arr.length < lengthMaxValue) { return true; } else { return false; } } console.log(isArrayLikeObject(null)); // false console.log(isArrayLikeObject({ 0: "a", 1: "b", length: 2 })); // true console.log(isArrayLikeObject({ 0: 1, 2: 3, length: "" })); // false console.log(isArrayLikeObject({ 0: 1, 2: 3 })); // false console.log(isArrayLikeObject([1, 2])); // false 

类数组如何转换为数组

  • 复制遍历
const arr = []; const arrayLike = { 0: 1, 1: 2, length: 2, }; for (let i = 0; i < arrayLike.length; i++) { arr[i] = arrayLike[i]; } console.log(arr); // [1, 2] 
  • slice, concat等
const arrayLike = { 0: 1, 1: 2, length: 2, }; const array1 = Array.prototype.slice.call(arrayLike); console.log(array1); // [ 1, 2 ] const array2 = Array.prototype.concat.
                
                

-六神源码网