数组或对象的扁平化处理

发布于 2022-06-03 13:28:11 字数 2434 浏览 1070 评论 0

数组的扁平化

1. 递归

function flatten(arr) {
    let result = [];
    arr.map((item) => {
        if(item.constructor == Array) {
            result = result.concat(flatten(item)); // concat 不改变原数组
            // result.push(...flatten(item));
        } else {
            result.push(item);
        }
    });
    return result;
}

2. Array.reduce()

function flatten(arr) {
    return arr.reduce((pre, next) => {
        return pre.concat(next.constructor == Array ? flatten(next) : next);
    }, []);
}

3. es6中的扩展操作符

[].concat(...arr),每次只会扁平化一层, so 判断该数组中有几层数组来一层一层的进行扁平。

let arr = [1,3,[3,6,[7]]];
[].concat(...arr) // [1,3,3,6,[7]]
function flatten(arr) {
    while(arr.some(item => item.constructor === Array)) {
        arr = [].concat(...arr); // 
    }
    return arr;
}

4. 使用 toString()

只对数组的元素都是数字时有效 valueOf()
如果数组是 [1, '1', 2, '2'] 的话,这种方法就会产生错误的结果。

[1,3,[3,6,[7]]].toString(); // "1,3,3,6,7"
[1,3,[3,6,[7]]].valueOf(); // [1,3,[3,6,[7]]]
function flatten(arr) {
    return arr.toString().split(',').map(item => +item);
}

对象的扁平化

function flatten(input) {
    let result = {}; // 结果是一个对象
    function process(key, value) {
        if(Object(value) !== value) { // 不是对象也不是数组(引用类型) 即基本类型 注意:要严格不相等
            if(key) result[key] = value;
        } else if(value.constructor === Array) {
            for(let i = 0,len = value.length; i < len; i++) {
                process(`${key}[${i}]`, value[i]);
            }
            if(key && value.length === 0) result[key] = [];
        } else {
            let isObjectEmpty = true;
            for(let item in value) {
                isObjectEmpty = false;
                process(key ? `${key}.${item}` : `${item}`, value[item]); // 判断是否有key来决定带不带. (对于第一次调用process有用)
            }
            if(isObjectEmpty && key) result[key] = {};
        }
    }
    process('', input);
    return result;
}

// 测试
const input = {
    a: 1,
    b: [1, 2, { c: true },
        [3]
    ],
    d: { e: 2, f: 3 },
    g: null,
    h: [],
    i: {}
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

JSmiles

生命进入颠沛而奔忙的本质状态,并将以不断告别和相遇的陈旧方式继续下去。

0 文章
0 评论
84961 人气
更多

推荐作者

醉城メ夜风

文章 0 评论 0

远昼

文章 0 评论 0

平生欢

文章 0 评论 0

微凉

文章 0 评论 0

Honwey

文章 0 评论 0

qq_ikhFfg

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文