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;
}

 

posted @ 2020-12-17 15:47  日升月恒  阅读(80)  评论(0)    收藏  举报