【问题标题】:Array of objects with some objects containing another array, need to filter it by values within the object containing an array对象数组,其中一些对象包含另一个数组,需要通过包含数组的对象中的值对其进行过滤
【发布时间】:2017-06-14 14:32:23
【问题描述】:

很抱歉,标题很长的问题不知道如何正确地提出我的问题。

所以这就是问题所在,我有一个存储对象的数组,在这些对象中还有另一个带有键标签的数组,它是一个用标签填充的数组。

对象:

var arr = new Array;

arr[0] = {
            "like": 0,
            "dislike": 0,
            "answer": "body",
            "tags" : ["offline", "facebook"],
            "comments" : []
        };

arr[1] = {
            "like": 0,
            "dislike": 0,
            "answer": "body",
            "tags" : ["school", "online"],
            "comments" : []
        };

arr[2] = {
        "like": 0,
        "dislike": 0,
        "answer": "body",
        "tags" : ["school", "offline"],
        "comments" : []
    };

[0]、[1] 索引表示和 ID,但这在这里并不重要。

问题是当我尝试过滤它时(我知道它只尝试过滤 arr[0] atm 但我会编写一个循环,以便它遍历所有索引):

var toFind = "offline";

var filtered = arr[0].filter(function(el) {
  return el.tags === toFind;
});

console.log(filtered);

它说 arr[0].filter 不是一个函数,但不知道为什么它认为 arr[0] 应该作为一个函数考虑。

当我删除 [0] 时,它会返回一个空白数组...

所以我的问题是如何让 .filter 函数根据标签数组中的标签返回完整的对象。因此,如果我搜索标签“学校”,它会返回 arr[1] 和 arr[2],即完整的对象。

希望我的问题非常清楚,并且我提供了足够的信息。如果你们需要更多信息,请随时向我索取。或者如果你想让我澄清一些事情,请问:)

希望大家能帮帮我!

【问题讨论】:

  • arr.filter(x => x.tags.includes(toFind))
  • Object.prototype 没有 filter() 方法,这是您使用 arr[0] 访问的方法。您只想过滤 arr 本身
  • 谢谢大家,感谢所有快速回复,它现在可以工作了!我使用了dgeare的解决方案!它创造了奇迹:)

标签: javascript arrays object filter


【解决方案1】:

就像已经说过的那样,arr[0] 指向一个没有过滤器方法的对象。您需要在数组本身上调用过滤器

var tagToFind = "school";
var arr = new Array;

arr[0] = {
            "like": 0,
            "dislike": 0,
            "answer": "body",
            "tags" : ["offline", "facebook"],
            "comments" : []
        };

arr[1] = {
            "like": 0,
            "dislike": 0,
            "answer": "body",
            "tags" : ["school", "online"],
            "comments" : []
        };

arr[2] = {
        "like": 0,
        "dislike": 0,
        "answer": "body",
        "tags" : ["school", "offline"],
        "comments" : []
    };

var filtered = arr.filter(function(item){
  return item.tags && //to account for undefined tags properties
    item.tags.includes(tagToFind); //if you're supporting IE you will need to look and check each element instead
});

console.log(filtered);

【讨论】:

  • @DennisJansen 欢迎您。乐于助人^_^
【解决方案2】:

参考文档:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter?v=control

你应该使用:

var arr = new Array;

arr[0] = {
            "like": 0,
            "dislike": 0,
            "answer": "body",
            "tags" : ["offline", "facebook"],
            "comments" : []
        };


var toFind = "offline";
//I'm filtering on arr[0].tags directly !! 
var filtered = arr[0].tags.filter(function(el) { 

  return el === toFind;
});

console.log(filtered);

【讨论】:

  • 感谢您的快速回复!它起作用了,但它只返回“离线”我需要整个对象。尽管如此,感谢您的快速回复,非常感谢。 Dgeare 的解决方案为我创造了奇迹,甚至不需要使用循环遍历所有索引:)
【解决方案3】:

如果我正确地解释了您的问题,那么您似乎想要一些类似的东西

arr.forEach((a) => {
    if (a["tags"].includes(toFind))
        console.log(a);
});

这将遍历arr 的每个元素并检查tags 数组是否包含toFind(如果包含则打印出对象)。

【讨论】:

    【解决方案4】:

    如果你想为整个数组做这个,那么试试这个

     var arr = new Array;
     arr[0] = {
            "like": 0,
            "dislike": 0,
            "answer": "body",
            "tags" : ["offline", "facebook"],
            "comments" : []
        };
    
      arr[1] = {
            "like": 0,
            "dislike": 0,
            "answer": "body",
            "tags" : ["school", "online"],
            "comments" : []
        };
    
       arr[2] = {
        "like": 0,
        "dislike": 0,
        "answer": "body",
        "tags" : ["school", "offline"],
        "comments" : []
    };
    var filtered = arr.filter(function(el) {
      return el.tags.find(function (entity){
        return entity===toFind;
      });
    });
    
     console.log(filtered);
    

    【讨论】:

      猜你喜欢
      • 2017-01-28
      • 2021-11-17
      • 2022-08-15
      • 2019-07-30
      • 1970-01-01
      • 2019-05-05
      • 1970-01-01
      • 1970-01-01
      • 2019-07-18
      相关资源
      最近更新 更多