MST

星途 面试题库

面试题:JavaScript 数组与对象操作之复杂数据处理

给定一个包含多个对象的数组 `let users = [ {name: 'Alice', age: 25, hobbies: ['reading', 'painting']}, {name: 'Bob', age: 30, hobbies: ['swimming', 'running']} ];`。要求编写一个函数,该函数可以根据传入的属性名(例如 'age' 或 'hobbies' 等)对数组中的对象进行排序,若属性值为数组,按数组长度排序。请说明你的实现思路以及如何处理可能出现的边界情况。
20.9万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 定义一个排序函数,接收数组和属性名作为参数。
  2. 在排序函数内部,使用 Array.prototype.sort 方法对数组进行排序。
  3. sort 方法的回调函数中,根据传入的属性名获取对象的属性值。
  4. 如果属性值是数组,比较数组的长度;如果是其他类型,直接比较属性值。

代码实现

function sortUsers(users, property) {
    return users.sort((a, b) => {
        const valueA = a[property];
        const valueB = b[property];

        if (Array.isArray(valueA) && Array.isArray(valueB)) {
            return valueA.length - valueB.length;
        } else if (Array.isArray(valueA)) {
            return -1;
        } else if (Array.isArray(valueB)) {
            return 1;
        } else {
            if (valueA < valueB) return -1;
            if (valueA > valueB) return 1;
            return 0;
        }
    });
}

边界情况处理

  1. 属性不存在:如果对象中不存在传入的属性名,在 sort 回调函数中比较时,valueAvalueB 会是 undefined,按常规比较规则处理,即 undefined 小于任何其他值(除了 null,它们相等)。
  2. 混合类型:当部分对象的属性值为数组,部分为其他类型时,上述代码中将数组类型排在其他类型之前(通过 if (Array.isArray(valueA)) return -1;if (Array.isArray(valueB)) return 1; 实现),可以根据实际需求调整此逻辑。