【问题标题】:Filter multiple values with multiple attributes js过滤具有多个属性js的多个值
【发布时间】:2021-06-10 19:07:18
【问题描述】:

我想用多个值过滤多个属性

'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"] }
    ]

用户选择搜索的这些数组

我可以得到这样的属性

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"]}
]

我想要一个循环的方法来获得像变量“过滤”这样的结果

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);

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

【问题讨论】:

  • 具体问题是什么?回想一下,您可以通过这种方式访问​​d.f_106,也可以访问d["f_106"]
  • 我想要一个方法或循环来生成类似于变量过滤的代码。如果我在 selectedAttr 中有 {"f_106": ["1000", "1001"]} 那么变量将类似于 var filters = d => (d.f_106.indexOf("1000") > -1 || d. f_106.indexOf("1001") > -1)
  • 所以你想迭代chosenAttr(在这个评论中每个项目都称为attr),并且对于每个attr,使用对象键来查看d你的哪个属性重新检查,看看attrValue 中是否存在任何d[attrKey] 值,这可以通过多种方式完成。你。可能是想多了:)
  • 是的,也许我可以像在 arr 列表中那样过滤产品。
  • 通过上述操作。

标签: javascript arrays json filter attributes


【解决方案1】:

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

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>

【讨论】:

  • 我很高兴能帮上忙 :)
猜你喜欢
  • 2016-08-03
  • 1970-01-01
  • 2021-11-03
  • 1970-01-01
  • 1970-01-01
  • 2021-03-17
  • 2021-05-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多