Javascript ForEach(Func.Every(将参数传递到数组函数中))

Javascript ForEach(Func.Every(将参数传递到数组函数中)),javascript,Javascript,我下面的示例可以工作,但它不是模块化的,它使用硬编码的switch语句来确定我的函数数组中存在多少个函数 我曾试图找出如何使用forEach和each,但在将参数传递到数组中包含的函数时遇到了问题。至少这是我目前的假设 以下内容不起作用 这是一个完整的工作示例,但不正确,因为它不是模块化的 任何帮助都将不胜感激 _这个=这个; //样本数据 _此.oData=[ {'itemfk':123,'vdrfk':24}, {'itemfk':13,'vdrfk':34}, {'itemfk':18,

我下面的示例可以工作,但它不是模块化的,它使用硬编码的switch语句来确定我的函数数组中存在多少个函数

我曾试图找出如何使用forEach和each,但在将参数传递到数组中包含的函数时遇到了问题。至少这是我目前的假设

以下内容不起作用

这是一个完整的工作示例,但不正确,因为它不是模块化的

任何帮助都将不胜感激

_这个=这个; //样本数据 _此.oData=[ {'itemfk':123,'vdrfk':24}, {'itemfk':13,'vdrfk':34}, {'itemfk':18,'vdrfk':77}, {'itemfk':13,'vdrfk':24}, {'itemfk':48,'vdrfk':34} ]; _this.oItemsSelected=[ {'itemfk':123}, {'itemfk':13} ]; _所选的这一点=[ {'vdrfk':234}, {'vdrfk':24} ]; //由级联控件调用 this.filterConditions=函数{ //将测试条件构建到函数数组中 var fc=[]; //物品状况 如果_this.oItemsSelected.length>0{ 推 函数oRow{ 对于变量nItem=0;nItem<\u this.oItemsSelected.length;nItem++{ //console.log_this.oitems已选择[nItem].itemname+'row'+oRow.itemname; 如果_this.oitems选择了[nItem].itemfk===oRow.itemfk{ 返回true; } }; 返回false; } ; }; //供应商状况 如果选择了_this.com.length>0{ 推 函数oRow{ 对于变量nVendor=0;nVendor<\u this.vovendorselected.length;nVendor++{ 如果选择了_this.vovendors[nVendor].vdrfk===oRow.vdrfk{ 返回true; } }; 返回false; } ; }; //循环数据和应用条件 _this.oFiltered=[]; _这是oData.Foreachorow函数{ 开关fc.length{ 案例1: 如果fc[0]或低{ _这是经过过滤的普索罗; }; 打破 案例2: 如果fc[0]或更低(&fc[1]或更低{ _这是经过过滤的普索罗; }; 打破 }; }; //两个oData行索引为零,三个匹配条件 console.log_这是经过筛选的; };
您可以尝试使用map和forEach方法,下面给出了工作演示

_这个=这个; //样本数据 _此.oData=[{ 'itemfk':123, “vdrfk”:24 }, { “项目FK”:13, ‘vdrfk’:34 }, { “项目FK”:18, ‘vdrfk’:77 }, { “项目FK”:13, “vdrfk”:24 }, { “项目FK”:48, ‘vdrfk’:34 } ]; _this.oItemsSelected=[{ 'itemfk':13 }, { 'itemfk':123 } ]; _所选的这一点=[{ “vdrfk”:234 }, { “vdrfk”:24 } ]; //由级联控件调用 this.filterConditions=函数{ var arr=_this.oItemsSelected.mapfunctionelement{ 返回对象。valueselement[0] }; var arr2=_this.vovendorselected.mapfunctionelement{ 返回对象。valueselement[0] }; _this.oData.forEachfunctionelement{ 如果arr.indexOfelement.itemfk!=-1&&arr2.indexOfelement.vdrfk!=-1{ console.logelement; } }; //两个oData行索引为零,三个匹配条件 }; Array.prototype.every的方法如下:

_this.oFiltered = _this.oData.filter(function (oRow) {
  return fc.every(function(func) {
    return func(oRow);
  });
});
如果替换此项:

// loop data and apply conditions
_this.oFiltered = [];
_this.oData.forEach(function (oRow) {

    switch (fc.length) {
        case 1:
            if (fc[0](oRow)) {
                _this.oFiltered.push(oRow);
            };
            break;
        case 2:
            if (fc[0](oRow) && fc[1](oRow)) {
                _this.oFiltered.push(oRow);
            };
            break;
    };
});
把这个片段放在这个答案上面,你就完成了

在下面的代码片段中,我冒昧地对您的脚本进行了一点修改——使用了a和其他一些方法。这可能有点让人困惑,但也许其中有一些有用/有趣的东西:

_这个={}; _this.oData=[{'itemfk':123,'vdrfk':24},{'itemfk':13,'vdrfk':34},{'itemfk':18,'vdrfk':77},{'itemfk':13,'vdrfk':24},{'itemfk':48,'vdrfk':34}]; _this.oItemsSelected=[{'itemfk':123},{'itemfk':13}]; _this.vovendorselected=[{'vdrfk':234},{'vdrfk':24}]; 函数createFilterFunction/*条件*/{ var conditions=Array.prototype.slice.applyarguments,//转换为实际数组,以便使用 fc=条件。mapfunctioncondition{ //我们为作为参数传递的每个条件创建一个新函数 返回函数行{ //如果数组中的一个项满足谓词,则返回true 返回条件.data.somefunctionitem{ 返回项[condition.key]==行[condition.key]; }; }; }; //用于过滤传递数据的实际函数 返回函数DataToFilter{ 将数据返回到Filter.filterfunctiondata{ //在这里,我们使用中的每个元素调用中的每个筛选函数,直到其中一个元素不满足谓词 返回fc.everyFunction函数{ 回来 功能数据; } }; }; } //设置过滤数据的功能 var filterConditions=createFilterFunction //=用于比较的项目 //=应比较其值的属性的名称 {data:_this.oItemsSelected,key:itemfk} ,{data:_this.com已选中,键:vdrfk} //第三个条件 //第四个条件 // ... ; var filteredConditions=filterConditions\u this.oData;
console.logJSON.stringifyfilteredConditions;你的第一个答案非常棒,非常简单,我几乎能理解发生了什么。自由版。。。这是我的头,但我得到的想法在原则上,将需要做更多的研究,以了解。我想我会把它留给一位当地的大师朋友来向我解释,我是JavaScript新手,不了解原型行为。但是非常感谢你指出有更好的方法!更好的方法取决于用例^^我添加了通用方法,因为我认为这可能会让您感兴趣:因为它是。。。非常有趣!你显然是个专家,我只是个初学者。尽管如此,我真的很感激你的回答,我至少欠你一两杯啤酒:-谢谢你的回答,但我不知道它如何回答我的问题。我的问题是,通过硬编码if条件,我必须为每个过滤器提供一个条件语句。如果我有一个可能的6个过滤器,并且在硬编码的解决方案中只有一个或两个被调用,那么所有6个过滤器都会被测试。在上面我选择的动态测试解决方案中,只执行创建的条件。谢谢你的努力。
_this.oFiltered = _this.oData.filter(function (oRow) {
  return fc.every(function(func) {
    return func(oRow);
  });
});
// loop data and apply conditions
_this.oFiltered = [];
_this.oData.forEach(function (oRow) {

    switch (fc.length) {
        case 1:
            if (fc[0](oRow)) {
                _this.oFiltered.push(oRow);
            };
            break;
        case 2:
            if (fc[0](oRow) && fc[1](oRow)) {
                _this.oFiltered.push(oRow);
            };
            break;
    };
});