筛选具有多个属性的多个值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>
我想过滤具有多个值的多个属性
'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>