当前位置: 首页 > 知识库问答 >
问题:

Javascript筛选对象数组

梁丘波鸿
2023-03-14

我需要获得的模块,与那些张贴的地方等于“维也纳”,我无法消除那些没有通过验证。

这是JSON。

const json = [
   {
      "title":"Module A",
      "postings":[
         {"name": "1", "categories":{"location":"Viena"},},
         {"name": "2", "categories":{"location":"Paris"},},
         {"name": "3", "categories":{"location":"Viena"},},
        ]
   },
   {
      "title":"Module B",
      "postings":[
         {"name": "1", "categories":{"location":"Madrid"},},
         {"name": "3", "categories":{"location":"Paris"},},
        ]
   },
   {
      "title":"Module C",
      "postings":[
         {"name": "1", "categories":{"location":"Madrid"},},
         {"name": "2", "categories":{"location":"Viena"},},
        ]
   },  
];

预期结果

[
  {
      "title":"Module A",
      "postings":[
         {"name": "1", "categories":{"location":"Viena"},},
         {"name": "3", "categories":{"location":"Viena"},},
        ]
   },
   {
      "title":"Module C",
      "postings":[
         {"name": "2", "categories":{"location":"Viena"},},
        ]
   },  
];

这就是我正在尝试的

const result = json
.filter(module => module.postings
.filter(posting => posting.categories.location === 'Viena').length);

实际结果

我无法删除那些不符合条件的帖子。

共有2个答案

冯良才
2023-03-14

我用reduce函数找到了一个快速的解决方案。

json.reduce((acc, curr) => {
    curr.postings = curr.postings.filter(e => e.categories.location == "Viena")
    if(curr.postings.length > 0)
        acc.push(curr);
    return acc;
}, []);

如果您想了解有关该函数更多信息,可以在以下站点找到:https://developer.mozilla.org/de/docs/web/javascript/reference/global_objects/array/reduce

慕阳伯
2023-03-14

filter需要返回一个真实的值-因此您应该在其中使用某些而不是另一个filter

null

const json = [
   {
      "title":"Module A",
      "postings":[
         {"name": "1", "categories":{"location":"Viena"},},
         {"name": "2", "categories":{"location":"Paris"},},
         {"name": "3", "categories":{"location":"Viena"},},
        ]
   },
   {
      "title":"Module B",
      "postings":[
         {"name": "1", "categories":{"location":"Madrid"},},
         {"name": "3", "categories":{"location":"Paris"},},
        ]
   },
   {
      "title":"Module C",
      "postings":[
         {"name": "1", "categories":{"location":"Madrid"},},
         {"name": "2", "categories":{"location":"Viena"},},
        ]
   },  
];

var result = json.filter(x => x.postings.some(p => p.categories.location == "Viena"));

console.log(result);
 类似资料:
  • 我是Elasticsearch的新手,我试图创建一个过滤器来检索具有特定属性的文档。 属性在映射中定义为嵌套对象,如下所示: 我试图以以下形式执行一个复杂的查询: 这是elasticsearch 2.x。我做错了什么?

  • 所以我使用redux和useSelector钩子从Store获取数据。 我可以在一个reducer数组中过滤特定的数据,这样组件只在过滤的数据发生变化时才更新,例如: 然而,当我尝试对一个对象进行相同的操作时,即使存储区没有改变,组件也总是重新呈现。例如: 为什么会发生这种情况,以及如何在数据发生变化时才进行更新?我假设将一些深入的比较函数传递给useSelector?

  • 我试图通过一个对象,和一些属性,我有有限数量的值,他们可以分配给。下面是我目前检查它们价值的方法: 有没有办法对此进行优化?

  • 问题 你想要根据布尔条件来筛选数组。 解决方案 使用 Array.filter (ECMAScript 5): array = [1..10] array.filter (x) -> x > 5 # => [6,7,8,9,10] 在 EC5 之前的实现中,可以通过添加一个筛选函数扩展 Array 的原型,该函数接受一个回调并对自身进行过滤,将回调函数返回 true 的元素收集起来。 # 扩展 A

  • 我希望能够过滤评论,所以只有真正的评论将为每个博客对象显示。我想展示每一个博客,而不仅仅是那些有真实评论的博客。我在网上找到的所有其他解决方案似乎都影响了我的博客对象。有没有一种方法可以过滤掉评论对象而不影响所有博客的查询? 因此,上述示例将在查询之后返回: 该示例仍然显示了没有评论或错误评论的博客。 这可能吗? 我一直在使用这个示例中的嵌套查询:ElasticSearch-Get只匹配嵌套对象与

  • 这一组数据在进行groupby前已经完成筛选,但进行groupby聚合后的结果显示是利用未筛选的数据进行的聚合,就像下面的结果,在groupby前已经完成点击量非0过滤,但最后仍存在含0的资源,询问chatGPT给的方案是可能用索引前的数据进行的聚合,重置索引后仍无法解决,请教大牛是否遇到过类似的问题,虽然可以在聚合后重新进行filter过滤,但这个问题搞得很焦灼 代码源文本