面试题汇总

目录

 1.排序:从老到新排序(按照时间戳从老到新的顺序进行排序)

方法一:

2.编写一个函数, 将一维数组结构转换成嵌套的树形结

方法一:使用Map数据结构实现

方法二:

方法三:


 1.排序:从老到新排序(按照时间戳从老到新的顺序进行排序)


方法一:
<script>

        // 输入数据
        var input = [
            {
                l: [{ id: 1, ts: '2022-09-10' }, { id: 2, ts: '2022-09-19' }]
            },
            {
                l: [{ id: 3, ts: '2022-01-19' }, { id: 4, ts: '2022-03-20' }, { id: 5, ts: '2021-08-22' }]
            },
            {
                l: [{ id: 6, ts: '2019-11-09' }, { id: 9, ts: '2018-03-12' }, { id: 10, ts: '2022-05-11' }, { id: 11, ts: '2022-07-05' }]
            },
            {
                l: [{ id: 7, ts: '2009-11-01' }]
            },
            {
                l: [{ id: 8, ts: '2022-09-28' }, { id: 13, ts: '2022-07-11' }, { id: 12, ts: '2020-03-02' }, { id: 20, ts: '2022-01-05' }, { id: 15, ts: '2022-05-10' }]
            },
        ]
        // 先找到每行最老的时间戳,然后再排序从老到新
        // 需要的输出结果:
        out = [
            { id: 7, ts: '2009-11-01' },
            { id: 9, ts: '2018-03-12' },
            { id: 12, ts: '2020-03-02' },
            { id: 5, ts: '2021-08-22' },
            { id: 1, ts: '2022-09-10' },
        ]


        function sort(input) {
            var timestamps = [];

            // 找到每行最老的时间戳
            input.forEach(obj => {
                var oldestTimestamp = obj.l.reduce((oldest, current) => {
                    if (oldest === null || current.ts < oldest.ts) {
                        return current;
                    }
                    return oldest;
                }, null);

                if (oldestTimestamp) {
                    timestamps.push(oldestTimestamp);
                }
            });

            // 按照时间戳从旧到新的顺序排序
            timestamps.sort((a, b) => a.ts.localeCompare(b.ts));

            var out = [];

            // 在原始输入数据中查找具有相应时间戳的对象,并添加到结果数组中
            timestamps.forEach(timestamp => {
                var foundObj = input.find(obj => {
                    var foundTimestamp = obj.l.find(element => element.ts === timestamp.ts);
                    return foundTimestamp !== undefined;
                });

                if (foundObj) {
                    out.push(foundObj.l.find(element => element.ts === timestamp.ts));
                }
            });

            return out;
        }

        console.log(sort(input));

    </script>

2.编写一个函数, 将一维数组结构转换成嵌套的树形结构


 //编写一个函数, 将一维数组结构转换成嵌套的树形结构

        const data = [
            { id: 1, pId: null},
            { id: 2, pId: 1 },
            { id: 3, pId: 1 },
            { id: 4, pId: 2 },
            { id: 5, pId: 2 },
            { id: 6, pId: 3 }
        ]

tree=
       {
            "id":1,
            "child":[
                {
                    "id":2,
                    "child":[
                        {"id":4,"child":[]},
                        {"id":5,"child":[]}
                    ]
                },
                {
                    "id":3,
                    "child":[
                        {"id":6,"child":[]}
                    ]
                }
            ]
        }

    
方法一:使用Map数据结构实现
/* 使用Map数据结构实现 */
    function convertToTree(data) {
        const map = new Map();
        const tree = [];
        for (const node of data) {
            const newNode = { ...node, children: [] };
            map.set(newNode.id, newNode);
            const parent = map.get(newNode.pId);
            if (parent) {
                parent.children.push(newNode);
            } else {
                tree.push(newNode);
            }
        }
        return tree;
    }
    const data = [
        { id: 1, pId: null },
        { id: 2, pId: 1 },
        { id: 3, pId: 1 },
        { id: 4, pId: 2 },
        { id: 5, pId: 2 },
        { id: 6, pId: 3 }
    ];
    const tree = convertToTree(data);
    console.log(tree);
方法二:
/* 方法二 */
    function convertToTree(data) {
        const tree = [];
        const lookup = {};

        // 创建节点
        data.forEach(item => {
            lookup[item.id] = { id: item.id, children: [] };
        });

        // 构建树
        data.forEach(item => {
            const node = lookup[item.id];
            if (item.pId === null) {
                tree.push(node);
            } else {
                const parent = lookup[item.pId];
                parent.children.push(node);
            }
        });

        return tree;
    }

    const data = [
        { id: 1, pId: null },
        { id: 2, pId: 1 },
        { id: 3, pId: 1 },
        { id: 4, pId: 2 },
        { id: 5, pId: 2 },
        { id: 6, pId: 3 }
    ];
    const tree = convertToTree(data);
    console.log(tree);
方法三:

  1. function buildTree(data, parentId = null) {
            const child = [];
    
            data.forEach(obj => {
                if (obj.pId === parentId) {
                    const subtree = buildTree(data, obj.id);
                    child.push(subtree);
                }
            });
    
            const node = { id: parentId, child: child };
            return node;
        }
    
        const data = [
            { id: 1, pId: null },
            { id: 2, pId: 1 },
            { id: 3, pId: 1 },
            { id: 4, pId: 2 },
            { id: 5, pId: 2 },
            { id: 6, pId: 3 }
        ]
    
        const treeObj = buildTree(data);
        console.log(JSON.stringify(treeObj));

3.实现json对象的深拷贝

    //递归方法实现深拷贝
    function deepCopy(obj){

        //如果输入的obj不是对象类型,或者为空,就直接返回它本身
        if(typeof obj !== "object" || obj === null){
            return obj;
        }

        let copy;

        //判断obj是否为数组,为数组类型,就循环遍历,递归进行拷贝
        if(Array.isArray(obj)){ 
            copy=[];
            for(let i=0;i<=obj.length;i++){
                copy[i] = deepCopy(obj[i]);
            }
        }else{  //另一种情况:就是obj为json对象
            copy={};
            for(let key in obj){//for in 循环对象的属性key
                if(obj.hasOwnProperty(key)){//判断对象本身上是否有某个属性
                    copy[key] = deepCopy(obj[key]); //如果有这个属性,就把这个属性的值赋给空的对象的这个属性,如果obj的这个属性的值为一个对象,则递归遍历执行原函数
                } 
            }

        }

        return copy;


    }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值