解决五个编程题的方法

426 阅读4分钟

第一题

id查询

 // 需求 : 两个数组,最终输出:
        //      ['员工张三,29岁,工作于百度', '员工李四,26岁,工作于阿里巴巴',...]

        var employees = [
            {
                name: "张三", // 员工名字
                empId: 0, // 员工id
                age: 29, // 员工年龄
                compId: 1, // 所属公司id
            },
            {
                name: "李四",
                empId: 1,
                age: 26,
                compId: 2,
            },
            {
                name: "王五",
                empId: 2,
                age: 28,
                compId: 1,
            },
            {
                name: "小明",
                empId: 3,
                age: 32,
                compId: 3,
            },
        ];

        var companies = [
            {
                name: "百度", // 公司名称
                id: 1, // 公司id
            },
            {
                name: "阿里巴巴",
                id: 2,
            },
            {
                name: "腾讯",
                id: 3,
            },
        ];

        /* 
        目标数据结构
        ['员工张三,29岁,工作于百度',
          '员工李四,26岁,工作于阿里巴巴',
          ...] */

      

第一种方法:

  // 1.employees 列表的  compId 字段   去  companies 列表中查询name
        // 参数: id    返回值是 name
        function getCompName(id) {
            /* let name = null;
            companies.forEach(item=>{
                if(item.id == id){
                    name = item.name;
                }
            })
            return name; */
            for (let i = 0; i < companies.length; i++) {
                if (companies[i].id == id) {
                    return companies[i].name;
                }
            }
        }

        // console.log(getCompName(2));

        // 2. 遍历员工列表,将一个特定的字符串 放进一个新数组中

        function getNewArr(arr) {
            let newArr = [];
            arr.forEach(item => {
                // console.log(`员工${item.name},${item.age}岁,工作于${getCompName(item.compId)}`);
                newArr.push(`员工${item.name}${item.age}岁,工作于${getCompName(item.compId)}`);
            })
            return newArr;
        }
        console.log(getNewArr(employees));

第二种方法:

var arr = []
        employees.forEach(e => {
            companies.forEach(el => {
                if (e.compId == el.id) {
                    arr[arr.length] = ('员工' + e.name + ',' + e.age + '岁,工作于' + el.name)
                    // arr.push('员工' + e.name + ',' + e.age + '岁,工作于' + el.name)
                    // console.log('员工'+e.name+','+e.age+'岁,工作于'+el.name);
                }
            })
        })
        console.log(arr);

第二题

对象转数组

// 需求: 请把下列的数组变成是: [['苹果','胡萝卜', '花生'], ['梨', '西芹', '坚果']....]
        var basket = [
            { fruit: "苹果", veg: "胡萝卜", nut: "花生" },
            { fruit: "梨", veg: "西芹", nut: "坚果" },
            { fruit: "香蕉", veg: "土豆", nut: "杏仁" },
            { fruit: "西瓜", veg: "豆芽", nut: "核桃" }
        ];

第一种:

        // 1. 遍历数组
        /*  var newArr = [];
         basket.forEach((item,index)=>{
             // console.log(item);
             // 2. 初始化 二维数组
             // 预期数据结构 [[],[],[],[]]
             newArr.push([]);
             // 3. 对象遍历
             for(let key in item){
                 newArr[index].push(item[key])
             }
         })
         console.log(newArr); */
 

第二种:

        /* var newArr = [];
        basket.forEach(item=>{
            // console.log(Object.values(item));
            // 对象转数组 之后 push 进新数组
            newArr.push(Object.values(item))
        })
        console.log(newArr); */

第三种

       /* // ****map方法 功能: 将每一次遍历时候返回的结果 合并成 一个新数组 整体返回
        var arr = [1, 2, 3, 4, 5];
        var newArr =  arr.map((item,index)=>{
            // console.log(item,index);
            return item+"你好强啊!!!"
        })

        console.log(newArr); */

        var newArr = basket.map(item=>{
            return Object.values(item);
        })
        console.log(newArr);

第四种

 var arr = []
        var list = []
        basket.forEach(e => {
            for (key in e) {
                list[list.length] = e[key]
            }
            arr[arr.length] = list
            list = []
        })
        console.log(arr);

第三题

数据统计

/*需求:
         程序实现对数据统计其出现的次数并按出现次数进行排序,
         [1到4] 作为参数(**参数可变**)传入js方法中,控制台输出如下结果
            1 出现了 3 次
            2 出现了 2 次
            4 出现了 2 次
            3 出现了 1 次 */
 // 1. 数组中参数可变 
        function getRandomArr(min, max, total) {
            let arr = [];
            for (let i = 0; i < total; i++) {
                arr.push(Math.floor(Math.random() * (max - min + 1) + min))
            }
            return arr;
        }

        let randomArr = getRandomArr(1, 5, 10);
        console.log(randomArr);

        // 2. 函数封装(程序)
        // 参数:randomArr   不需要返回值
        function countNum(arr) {
            // 3.初始化对象
            // 思想: 初始化一个值为1 然后做累加 
            // 预期的数据类型:
            /*
                {
                    1:2,
                    2:2;
                    4:1
                    。。。。。。。
                }
            */
            let obj = {};
            // 4.遍历数组
            arr.forEach(item => {
                // 对象添加/修改属性值, 
                // obj.name = xxx 如果没有这个key 是添加, 如有是修改
                // 5. 判断什么时候初始化为某个 key 次数1
                if (obj[item]) {
                    obj[item]++;
                } else {
                    obj[item] = 1;
                }
            })
            
            // console.log(obj);
            // 6. 对象遍历,打印需求文字
            // 7.排序
            let newArr= [];

            for(let k in obj){
                // console.log(`${k} 出现了 ${obj[k]} 次`);
                newArr.push({num:k,count:obj[k]})
            }
            // console.log(newArr);

            newArr.sort((a,b)=>{
                return a.count-b.count;
            }).forEach(item=>{
                // console.log(item);
                console.log(`${item.num} 出现了 ${item.count} 次`);
            })
        }
        countNum(randomArr);

第四题

数组行转列

 // 需求: 实现二维数组行转列
        var arr = [
            ["前端", "3人", "8-15k", "本科"],
            ["后端", "5人", "10-25k", "研究生"],
            ["UI", "2人", "9-11k", "大专"],
            ["ETL工程师", "10人", "6-12k", "大专"],
        ];

 /* 转换 =>
        var newArr = [
            ["前端", "后端", "UI", "ETL工程师"],
            ["3人", "5人", "2人", "10人"],
            ["8-15k", "10-25k", "9-11k", "6-12k"],
            ["本科", "研究生", "大专", "大专"],
        ]; */

方法一


        // 思路: 两次遍历   1 行转列  2 列转行
        let newArr = [];
        // 1. 遍历行  arr[0]
        for (let i = 0; i < arr[0].length; i++) {
            // 预期数据类型:
            //     [
            //         []
            //         []
            //         []
            //         []
            //     ]
            
            // 2. 列的初始化
            newArr[i] = [];
            // 3. 列转行
            for (let j = 0; j < arr.length; j++) {
                // 预期数据类型: 
                //     [
                //         ["前端", "后端", "UI", "ETL工程师"]
                //         []
                //         []
                //         []
                //     ]
                // 4. 列数据 塞进 行内
                newArr[i][j]= arr[j][i];
            }
        }

        console.log(newArr);

方法二

// 1 行转列  2 列转行
        let newArr = arr[0].map((col, index) => {
            // 这个return 类似于 newArr[i] = [];
            return arr.map(row=>{
                // 这里return 类似于  ["前端", "后端", "UI", "ETL工程师"]
                return row[index];
            })
        })

        console.log(newArr);

方法三

var arr2 = []
        var arr3 = []
        function list(num) {
            arr.forEach(function (e) {
                arr2[arr2.length] = e[num]
            })

            arr3[arr3.length] = arr2
            arr2 = []
        }
        for (var i = 0; i < arr.length; i++) {
            list(i)
        }
        console.log(arr3);

第五题

对象数组去重排序

      // 需求:对以下数据 取出每人(name)最大的销售量(sales)数据 ( 对sales排序对name去重)
        var arr = [
            { name: "小明", year: 2019, sales: 53 },
            { name: "小明", year: 2020, sales: 234 },
            { name: "小明", year: 2018, sales: 24 },
            { name: "小强", year: 2019, sales: 31 },
            { name: "小强", year: 2020, sales: 567 },
            { name: "小强", year: 2018, sales: 678 },
            { name: "小红", year: 2019, sales: 465 },
            { name: "小红", year: 2020, sales: 82 },
            { name: "小红", year: 2018, sales: 576 },
            { name: "小马", year: 2019, sales: 4567 },
            { name: "小马", year: 2020, sales: 832 },
            { name: "小马", year: 2018, sales: 674 },
        ];
       /*  var arr = [1,2,1,7,4,6,4,6,4,7];
        // 数组的原型方法 sort  默认是升序排列
        console.log(arr.sort((a,b)=>{
            // 升序
            // return a-b;
            // 降序
            return b-a;
        })); */

        // 1. 函数封装   参数 arr  返回值 新数组
        function getArrayObject(arr){
            let obj = {};
            // 2. 对sales属性进行排序(升序)
            arr.sort((a,b)=>{
                // a b 对应的是数组的值{}
                return a.sales-b.sales;
                // 3. 对name去重 保留最大销售数据
            }).forEach(item=>{
                // console.log(item);
                // 对象的特性: 给key进行赋值,如果存在,会修改(覆盖)
                /*
                    预期的数据类型:
                    {
                        "小明":{ name: "小明", year: 2020, sales: 234 },
                        "小马":{ name: "小马", year: 2019, sales: 4567 },
                    }
                */
                obj[item.name] = item;
            })
            // console.log(arr);

            // console.log(obj);
            // 4. 返回新数组
            return Object.values(obj);
            // return 新数组
        }

        console.log(getArrayObject(arr));

方法二

 // 设置需要的变量
        var list = [], arr2 = [], num = 0
        // 先存第一个数据
        list[0] = arr[0]
        // console.log(list);
        for (var i = 1; i < arr.length; i++) {
            // 判断name值是否相等,相等就放list数组里面如何排序取最大那个给到arr2
            if (list[list.length - 1].name == arr[i].name) {
                list[list.length] = arr[i]
                // 排序
                list.sort(function (min, max) {
                    return min.sales - max.sales
                })
                // 赋值给arr2第num个
                arr2[num] = list[list.length - 1]
            } else {
                // 如果name等,那么使用第arr[i]个覆盖list前面的数据,并且num++
                list = [arr[i]]
                num++
            }
        }
        // 给取好的值按sales排序
        arr2.sort(function (min, max) {
            return min.sales - max.sales
        })
        console.log(arr2);