js数组相关
const { delete } = require("request"); /** * 数组循环:forEach / map / for of */ // foreach适用于只是进行集合或数组遍历,for则在较复杂的循环中效率更高。 // foreach不能对数组或集合进行修改(添加删除操作),如果想要修改就要用for循环 // forEach就是for循环的简化没有返回值 map有返回值,可以操作数组 var myArray = [1, {}, []] myArray.forEach((e, i) => { if(Object.prototype.toString.call(e) === '[object Object]'){ e.a = 2; } else if( e.constructor === Array ) { e.push(3) } }) console.log(myArray) // [1, { a: 2}, [3]] var newMapList = myArray.map((e) => { if(e.constructor === Object){ e.b = 2; if(e.hasOwnProperty('a')){ // hasOwnProperty 只能识别对象自身的属性 delete e.a } if('b' in e){ // in运算符 不仅能识别对象自身的属性 也能识别继承的属性 (属性 in 对象) e.b = 'in' } } if(Array.isArray(e)){ //isArray() 方法用于判断一个对象是否为数组 e.push(5) } return e }) console.log(newMapList) // [1, { b: 'in'}, [3, 5]] // for of 循环 可以使用break跳出循环 for(let n of myArray){ if(typeof n !== "number") break; console.log('n--',n) // 1 }
// entries() 方法返回一个数组的迭代对象,该对象包含数组的键值对 (key/value)。 for(let [index, ele] of myArray.entries()) { if(typeof ele !== "number") break; console.log('n--',ele) // 1 }
/** * 数组判断 findIndex / find / some / includes / every */ var fiList = [{ name: 'lisi' },{ name: 'zhangsan' },{ name: 'wangwu' }] // some() 方法用于检测数组中的元素是否满足指定条件 fiList.some(e => {return e.name == 'zhangsan'}) // true // findIndex() 判断数组中对象是否存在值 fiList.findIndex((e) => {return e.name == 'wangwu'}) // 2 // find() 方法返回通过测试(函数内判断)的数组的第一个元素的值 // 当数组中的元素在测试条件时返回 true 时, find() 返回符合条件的元素,之后的值不会再调用执行函数。 // 如果没有符合条件的元素返回 undefined fiList.find((e) => {return e.name == 'wangwu'}) //{ name: 'wangwu'} // includes() 找到匹配则返回 true,否则返回 false / 也可用于检测字符串(区分大小写) [1,2,3,4].includes(2) // true 'wangwu'.includes('wu') // true [{ name: 'wangwu'}].includes({ name: 'wangwu'}) // false 不能检测对象 // every() 方法用于检测数组所有元素是否都符合指定条件。 // every() 方法使用指定函数检测数组中的所有元素: // 如果数组中检测到有一个元素不满足,则整个表达式返回 false ,且剩余的元素不会再进行检测。 // 如果所有元素都满足条件,则返回 true。 var ages = [32, 16, 40]; [].every(e => e === true) //true // 注意: every() 不会对空数组进行检测。空数组检测返回 true。 ages.every((ele,index) => ele > 18) //false ages.every((ele,index) => ele > 15) //true /** * 数组过滤 filter */ [1,2,3,5].filter(e => e > 2) // [3, 5] /** * 数组计算 reduce / Math.max.apply */ // 数组累加 reduce():从数组的第一项开始,逐个遍历到最后 var values = [1,2,3]; var sum = values.reduce(function(prev, cur, index, array){ return prev + cur; });//求数组中所有值的和 console.log(sum) // 6 // 计算数组中最大值 var maxList = [1,2,3,4,5] let _max = Math.max.apply(null, maxList) // Math.max()方法,支持传递多个参数,比如:Math.max(1,4,2,3,7,5,6) // 但是它不支持直接传递一个数组作为参数,比如:Math.max(new Array(1,4,2,3,7,5,6))。 /** * 数组结构 */ // 数组中的对象排序 var arrObjSort = { _compare(property){ // 从大到小 return function(a,b){ var value1 = a[property]; var value2 = b[property]; return value2 - value1; } }, _overdueSort(property){ // 从小到大 return function(a,b){ var value1 = a[property]; var value2 = b[property]; return value1 - value2; } }, _sort(){ let overdueList = [{num:1},{num:2},{num:5},{num:3}] overdueList.sort(this._overdueSort('num')) console.log(overdueList) } } arrObjSort._sort() // 按照首字母排序 let retn = ['Bas', 'D', 'C', 'K', 'A', 'Z'] retn.sort((a, b) => { return a.charCodeAt(0) - b.charCodeAt(0) // charCodeAt() 方法可返回指定位置的字符的 Unicode 编码。 // 字符串中第一个字符的位置为 0, 第二个字符位置为 1,以此类推。 }) console.log(retn) /** 单层数组生成树状结构 */ let account_subject_list = [ { "subject":"1221", "name":"其他应收款", "parent":"" },{ "subject":"1221.01", "name":"单位往来", "parent":"1221" },{ "subject":"1231.01", "name":"其他应收款", "parent":"1231" },{ "subject":"2221", "name":"应交税费", "parent":"" },{ "subject":"2221.01", "name":"增值税", "parent":"2221" },{ "subject":"2221.01.01", "name":"进项税额", "parent":"2221.01" },{ "subject":"2221.01.02", "name":"销项税额", "parent":"2221.01" },{ "subject":"2221.01.02.01", "name":"销项税额", "parent":"2221.01.02" } ] function getTree(list) { const tree = {} const arr = [] list.forEach(item => { tree[item.subject] = item }) list.forEach(item => { if(!tree[item.parent]){ arr.push(item) } else { tree[item.parent].children = tree[item.parent].children || [] tree[item.parent].children.push(item) } }) return arr } const tree = getTree(account_subject_list) console.log('tree',tree) /** * 树状结构铺平 */ function flat(tree) { let arr= []; const expanded = datas => { if (datas && datas.length > 0){ datas.forEach(e => { arr.push({ subject: e.subject, name: e.name, parent: e.parent }); expanded(e.children); }) } }; expanded(tree); return arr; } const flatTree = flat(tree) console.log("铺平===", flatTree) /** * 深拷贝 */ // JSON.stringfy()和JSON.parse()即可搞定。但是这种简单粗暴的方法有其局限性。当值为undefined、function、symbol 会在转换过程中被忽略 // 自定义深拷贝 function deepCopy(obj) { var result = Array.isArray(obj) ? [] : {}; for (var key in obj) { if (obj.hasOwnProperty(key)) { if (typeof obj[key] === 'object' && obj[key] !== null) { result[key] = deepCopy(obj[key]); //递归复制 } else { result[key] = obj[key]; } } } return result; }
// 数组转对象 const optArr = ["id",, "remark"]; const optObj = optArr.reduce((opt, key) => { opt[key] = formOpt[key]; return opt }, { temp_only_key: Math.random() + '' // 初始值: 唯一key }); // 唯一key用于删除列表时更新DOM,:key="index"视图层每次都是删除组后一个 e.temp_only_key = Math.random() + ''; 将日期时间转换为本地时间格式的字符串: new Date().toLocaleString() async createDiagram() { await bpmnModeler.importXML(xml); } return new Promise((resolve, reject) => { resolve(); // return reject() })
// entries / break 中断数组循环 let allData = [1, 2, 3, {}] for (let [i, ele] of allData.entries()) { console.log('i, ele==', i, ele) const isLoop = ele === 3 if (!isLoop) break; }