筛选具有多个属性的多个值js

Filter multiple values with multiple attributes js

我想过滤具有多个值的多个属性

'arr' 是所有产品的列表,f_... 是颜色或类型等属性。

'namet' 是用户选择的属性。

'keyt'是红、黄、绿各属性的值。

 let arr = [
        { "id": 523, "f_105": ["992","996"],  "f_104": ["985"], "f_106":["1000"] },
        { "id": 524, "f_105": ["993","996"],  "f_104": ["984"], "f_106":["1001"] }
    ]

这些用户选择搜索的数组

我可以得到这样的 attrubites

var namet = ['f_106', 'f_106', 'f_105', 'f_105', 'f_104' ];
var keyt  = ['1000' , '1001', '993', '996', '985'];

var chooenKey = ['f_106', 'f_105', 'f_104']
var chosenAttr = {
    "f_106": ["1000", "1001"],
    "f_105": ["993", "996"],
    "f_104": ["985"],
}

var chosenAttr =
[
    {"f_106": ["1000", "1001"]},
    {"f_105": ["993", "996"]},
    {"f_104": ["985"]}
]

我想要一个方法来循环获取像变量这样的结果 'filtered'

var filtered = d => 
        (d.f_106.indexOf("1000") > -1 || d.f_106.indexOf("1001") > -1) && 
        (d.f_105.indexOf("993")  > -1  || d.f_105.indexOf("996") > -1)  &&
        (d.f_104.indexOf("985")  > -1)

然后放在这里

const f = arr.filter(filtered);

您还可以提供另一种类型来过滤具有多个属性的产品。

如果你检查我发送的例子,我相信它会解决你的问题。

let arr = [
    { "id": 523, "f_105": ["992", "996"], "f_104": ["985"], "f_106": ["1000"] },
    { "id": 524, "f_105": ["993", "996"], "f_104": ["984"], "f_106": ["1001"] }
]


var chosenAttr =
    [
        { "f_106": ["1000", "1001"] },
        { "f_105": ["992"] },
        { "f_104": ["985"] }
    ]



function filterArr() {
    var arrCopy = arr;

    for (i = 0; i < chosenAttr.length; i++) {
        for (var key in chosenAttr[i]) {
            arrCopy = arrCopy.filter(function (item) {
                var is_match = false;

                for (var idx in chosenAttr[i][key]) {
                    let val = chosenAttr[i][key][idx];

                    if (item[key].indexOf(val) > -1) {
                        is_match = true;
                    }
                }
                return is_match;
            });
        }
    }

    return arrCopy;
}

var filterData = filterArr();
$('#response').html(JSON.stringify(filterData));
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<pre>
<code id="response">
  
</code>
</pre>