如何使用 jquery 创建泛型方法

How to create generic method using jquery

我已经实现了具有 excel 类似过滤器功能的 JQgrid。在这里,我在搜索工具栏上有下拉列表。我需要帮助来删除我在创建动态下拉列表时使用的重复代码。 代码如下:

    // Start ---- Dropdown filter Implementation //
    beforeProcessing: function (data) {
        var sourceLocaleMap = {}, sourceLocaleValues = ":All", rows = data.rows, i, sourceLocale, sourceLocaleName;
        for (i = 0; i < rows.length; i++) {
            sourceLocale = rows[i].SourceLocaleId;
            sourceLocaleName = rows[i].SourceLocaleName;
            if (!sourceLocaleMap.hasOwnProperty(sourceLocale)) {
                sourceLocaleMap[sourceLocale] = 1;
                sourceLocaleValues += ";" + sourceLocale + ":" + sourceLocaleName;
            }
        }
        $(this).jqGrid("setColProp", 'SourceLocaleId', {
            stype: "select",
            searchoptions: {
                value: sourceLocaleValues.substring(5),
                sopt: ["eq", "ne"],
                clearSearch: false,
                attr: { multiple: 'multiple', size: 29 },
                dataInit: dataInitMultiselect
            }
        })

        var CompanyMap = {}, CompanyValues = ":All", rows = data.rows, i, Company, CompanyName;
        for (i = 0; i < rows.length; i++) {
            Company = rows[i].CompanyId;
            CompanyName = rows[i].CompanyName;
            if (!CompanyMap.hasOwnProperty(Company)) {
                CompanyMap[Company] = 1;
                CompanyValues += ";" + Company + ":" + CompanyName;
            }
        }
        $(this).jqGrid("setColProp", 'CompanyId', {
            stype: "select",
            searchoptions: {
                value: CompanyValues.substring(5),
                sopt: ["eq", "ne"],
                clearSearch: false,
                attr: { multiple: 'multiple', size: 2 },
                dataInit: dataInitMultiselect
            }
        })

        var CurrencyMap = {}, CurrencyValues = ":All", rows = data.rows, i, Currency, CurrencyName;
        for (i = 0; i < rows.length; i++) {
            Currency = rows[i].CurrencyId;
            CurrencyName = rows[i].CurrencyName;
            if (!CurrencyMap.hasOwnProperty(Currency)) {
                CurrencyMap[Currency] = 1;
                CurrencyValues += ";" + Currency + ":" + CurrencyName;
            }
        }
        $(this).jqGrid("setColProp", 'CurrencyId', {
            stype: "select",
            searchoptions: {
                value: CurrencyValues.substring(5),
                sopt: ["eq", "ne"],
                clearSearch: false,
                attr: { multiple: 'multiple', size: 17 },
                dataInit: dataInitMultiselect
            }
        })

        var LocaleMap = {}, LocaleValues = ":All", rows = data.rows, i, Locale, LocaleName;
        for (i = 0; i < rows.length; i++) {
            Locale = rows[i].LocaleId;
            LocaleName = rows[i].LocaleName;
            if (!LocaleMap.hasOwnProperty(Locale)) {
                LocaleMap[Locale] = 1;
                LocaleValues += ";" + Locale + ":" + LocaleName;
            }
        }
        $(this).jqGrid("setColProp", 'LocaleId', {
            stype: "select",
            searchoptions: {
                value: LocaleValues.substring(5),
                sopt: ["eq", "ne"],
                clearSearch: false,
                attr: { multiple: 'multiple', size: 2 },
                dataInit: dataInitMultiselect
            }
        }).jqGrid('destroyFilterToolbar')
          .jqGrid('filterToolbar', {
              stringResult: true,
              searchOnEnter: false,
              defaultSearch: "cn"
          });
    },
    // End ---- Dropdown filter Implementation //

正如上面代码中提到的,我想要一个函数而不是重复的代码。这里我有四个不同的 Id,具有不同的参数。我想要一个函数,我只能传递参数并取决于将设置的参数值。请指导我如何实现它并减少代码中的冗余数据。提前致谢。

我创建了以下函数而不是重复相同的数据并解决了我的问题。可能对任何人都有帮助。请查找代码供您参考。

getUniqueNames = function (columnName, data) {
    var textsMap = {}, Values = ":All", rows = data.rows, i, textKey, textValue;
    var columnValue = columnName.substring(0, columnName.length - 2) + 'Name';

    //Ascending order sorting
    rows.sort(compare);
    function compare(a, b) {
        if (a[columnValue] < b[columnValue])
            return -1;
        if (a[columnValue] > b[columnValue])
            return 1;
        return 0;
    }

    for (i = 0; i < rows.length; i++) {
        textKey = rows[i][columnName];
        textValue = rows[i][columnValue];
        if (!textsMap.hasOwnProperty(textKey)) {
            textsMap[textKey] = 1;
            Values += ";" + textKey + ":" + textValue;
        }
    }
    return Values;
},

setSearchSelect = function (columnName, data) {
    $('#list2').jqGrid('setColProp', columnName,
                {
                    stype: 'select',
                    searchoptions: {
                        value: (getUniqueNames(columnName, data)),
                        sopt: ["eq", "ne"],
                        clearSearch: false,
                        sortorder: 'asc',
                        attr: { multiple: 'multiple' },
                        dataInit: dataInitMultiselect
                    }
                })
      });
};