首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用字典过滤javascript数据对象

使用字典过滤javascript数据对象
EN

Stack Overflow用户
提问于 2018-08-03 06:28:05
回答 4查看 2K关注 0票数 0

假设我有一个过滤器:

代码语言:javascript
复制
filter = [ {key: "pl", value: 3}, {key: "sh", value: 2} ]

我想用上面的过滤条件过滤下面的javascript对象:

代码语言:javascript
复制
var data = [
{title: "The Uncertainty of the Poet ",
pl: 3,
si: 2,
va: 3,
te: 0,
co: 0,
or: 4,
sh: 2,
po: 0,
li: 0,
ar: 5
},
{
title: "Direction",
pl: 4,
si: 3,
va: 1,
te: 3,
co: 0,
or: 3,
sh: 2,
po: 0,
li: 0,
ar: 5
}
...
]

我尝试了以下方法,但没有成功:

代码语言:javascript
复制
var result = data.filter(function(d){
            for (item in filter) {
                return d.key==d.value;
            }
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-08-03 06:43:51

只是检查对象是否满足所有条件的另一个潜在选项:

代码语言:javascript
复制
data.filter(function(obj) {
    return filter.reduce(function(a, f) {
        return a && (obj[f.key] === f.value);
    }, true);
});

由于使用了reduce,因此无需检查hasOwnProperty即可工作。如果要检查是否有任何筛选条件为真,则应将其更改为

代码语言:javascript
复制
data.filter(function(obj) {
    return filter.reduce(function(a, f) {
        return a || (obj[f.key] === f.value);
    }, false);
});
票数 1
EN

Stack Overflow用户

发布于 2018-08-03 07:09:40

你也可以这样做:

代码语言:javascript
复制
var filters = [{key: "pl", value: 3}, {key: "sh", value: 2}]

var data = [
    {
        title: "The Uncertainty of the Poet ",
        pl: 2,
        si: 2,
        va: 3,
        te: 0,
        co: 0,
        or: 4,
        sh: 3,
        po: 0,
        li: 0,
        ar: 5
    },
    {
        title: "Direction",
        pl: 3,
        si: 3,
        va: 1,
        te: 3,
        co: 0,
        or: 3,
        sh: 2,
        po: 0,
        li: 0,
        ar: 5
    }
]

var result = data.filter((item) => {
  for(let i = 0; i < filters.length; ++i) {
    let filter = filters[i];

    if(item[filter.key] && item[filter.key] === filter.value) {
      return true;
    }
  }

  return false;
});
票数 1
EN

Stack Overflow用户

发布于 2018-08-03 06:41:19

你的for in还不够深入。它循环遍历数组,而不是处理数组中的每个对象

我可以使用Array#every()来确保过滤器数组中的每个对象在数据对象中都有匹配

代码语言:javascript
复制
// filter main data
var result = data.filter(function(dataObj){
   // check if all proprties within filter array are a match
   return filter.every(function(filterObj){
      //compare value of property found in filterObject with value 
      return dataObj[filterObj.key] === filterObj.value
   })
})

console.log(result)
代码语言:javascript
复制
<script>
var filter = [ {key: "pl", value: 2}, {key: "sh", value: 3} ]

var data = [{
    title: "The Uncertainty of the Poet ",
    pl: 2,
    si: 2,
    va: 3,
    te: 0,
    co: 0,
    or: 4,
    sh: 3,
    po: 0,
    li: 0,
    ar: 5
  },
  {
    title: "Direction",
    pl: 4,
    si: 3,
    va: 1,
    te: 3,
    co: 0,
    or: 3,
    sh: 2,
    po: 0,
    li: 0,
    ar: 5
  }
 
]
</script>

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51662955

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档