实现链式调用的 find 函数示例代码

使用 GPT-4o Mini 回答,作者 GPT4oMini.app

问题:

/**

  • 请实现find函数,使下列的代码调用正确。
  • title数据类型为String
  • userId为主键,数据类型为 Number */

var find = function(data) { // your code are here...

}

var result = find(data).where({ 'title': /\d$/ }).orderBy('userId', 'desc');

console.log(result);// [{ userId: 19, title: 'title2'}, { userId: 8, title: 'title1' }];

答案:

要实现 find 函数,使得后续的调用能够正确执行,我们需要确保 find 函数返回一个对象,该对象具有 whereorderBy 方法。以下是一个可能的实现:

var find = function(data) {
    // 返回一个对象,包含 where 和 orderBy 方法
    return {
        where: function(criteria) {
            // 过滤数据,符合 criteria 的项
            const filteredData = data.filter(item => {
                // 检查每个条件
                return Object.keys(criteria).every(key => {
                    // 如果是正则表达式,使用 test 方法
                    if (criteria[key] instanceof RegExp) {
                        return criteria[key].test(item[key]);
                    }
                    // 否则直接比较
                    return item[key] === criteria[key];
                });
            });
            // 返回一个新的对象,继续链式调用
            return {
                data: filteredData,
                orderBy: this.orderBy
            };
        },
        orderBy: function(key, order) {
            // 对数据进行排序
            const sortedData = this.data.sort((a, b) => {
                if (order === 'asc') {
                    return a[key] - b[key];
                } else {
                    return b[key] - a[key];
                }
            });
            return sortedData;
        }
    };
};

// 示例数据
var data = [
    { userId: 19, title: 'title2' },
    { userId: 8, title: 'title1' },
    { userId: 5, title: 'title3' },
    { userId: 12, title: 'title4' }
];

// 调用 find 函数
var result = find(data).where({
    'title': /\d$/
}).orderBy('userId', 'desc');

console.log(result); // [{ userId: 19, title: 'title2'}, { userId: 8, title: 'title1' }];

解释:

  1. find 函数:返回一个对象,该对象包含 whereorderBy 方法。
  2. where 方法:接受一个条件对象 criteria,使用 Array.prototype.filter 方法过滤数据。对于每个条件,检查数据项是否符合条件。
  3. orderBy 方法:对过滤后的数据进行排序。根据传入的 keyorder(升序或降序)进行排序。

这样实现后,调用 find(data).where({...}).orderBy(...) 的链式调用就能正常工作,返回符合条件的排序结果。