包含另一个数组的某些对象的对象数组需要通过包含数组的对象中的值对其进行过滤

时间:2017-06-14 14:32:23

标签: javascript arrays object filter

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

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

对象:

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]索引respresent和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函数根据tags数组中的标记返回完整的对象。因此,如果我搜索标签" school"它给出了arr [1]和arr [2],完整的对象。

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

希望你们能帮助我!

4 个答案:

答案 0 :(得分:0)

参考文件: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);

答案 1 :(得分:0)

如前所述,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);

答案 2 :(得分:0)

如果我正确地解释你的问题,你似乎想要一些类似

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

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

答案 3 :(得分:0)

如果你想为整个阵列做这个,那么试试这个

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