最近写项目中遇到一个问题 多级嵌套数组对象总是需要传递下标或者key 才可以访问下一级数据 可是如果我传入字符串就无法直接访问

[1,[2,3],[4,5,[6]] ---->[1,2,3,4,5,6]

1.reduce

遍历数组每一项,若值为数组则递归调用否则合并

const arr = [1, [2, 3, [4, 5]], 6]
// reduce 加数器 语法 arr.reduce(方法,初始化的值)
function fn(arr) {
    return arr.reduce((prev, cur, index) => {
        if (Array.isArray(cur)) {// 判断是不是数组
            return prev.concat(fn(cur))// 是数组 递归调用
        } else {
            return prev.concat(cur) // 合并 这个数组
    }, [])
console.log(fn(arr));  //  [1, 2, 3, 4, 5, 6]

reduce是数组中的一种方法

2.toString & split

调用数组的 toString 方法,将数组变为字符串再用 split 分割还原为数组

function fn(arr) {
    // 数组转换为字符串然后进行spli(',') 进行拆分为原数组
    // 这时 原数组是字符串数组 这就需要把每一项转换为数字
    return arr.toString().split(',').map(function (item) {
        return Number(item)

3. join & split

和上面的toString 方法类似 join 也可以将数组转化为 字符串

function fn(arr) {
    return arr.join(',').split(',').map(function(item) {
        return parseInt(item);

递归的遍历每一项,若为数组则继续遍历,否则 concat

function fn(arr) {
    let res = []
    arr.map(item => {
        if (Array.isArray(item)) { // 判断是不是数组
            res = res.concat(fn(item))
        } else {
            res.push(item)
    return res;

5. 拓展运算符

es6 的扩展运算符能将二维数组变为一维

[].concat(...[1, 2, 3, [4, 5]])

遍历数组arr,若arr[i]为数组则递归遍历,直至arr[i]不为数组然后与之前的结果concat。

对象的方法

1.reduce

通过递归合并和拼接路径进行转换为 arr.name=value

const fillObj = (types, actionKey = '') => { // 循环对象中的的 key 进行合并为对象
    let res = Object.keys(types).reduce((msg, nextvs): any => { //  获取当前 obj[变量值] 
        const value = types[nextvs]  // 进行拼接 value
        const Key = actionKey ? `${actionKey}.${nextvs}` : nextvs   //  作用:进行拼接 KEY  判断  当前   obj[变量值] 有没有子级 如果有 递归
        if (typeof value === 'object') { // 如果还是对象的话 进行递归调用
            Object.assign(msg, fillObj(value, nextvs)) // 合并当前对象 和递归出来的返回值
        } else {
            msg[Key] = value// 拿到 拼接的 key 和当前value 组成对象键值对
        return msg
    }, {})
    return res

欢迎提出建议

---记录旅行遇到的事迹         仅用于旅行记录 欢迎志同道合的朋友

分类:
前端
标签: