繁体   English   中英

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

[英]Array of objects with some objects containing another array, need to filter it by values within the object containing an array

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

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

宾语:

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函数以基于标签数组中的标签来返回完整的对象。 这样,如果我搜索标签“ school”,它会返回完整的对象arr [1]和arr [2]。

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

希望你们能帮助我!

参考文档: https : //developer.mozilla.org/zh-CN/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);

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

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

如果我正确地解释了您的问题,则似乎您想要一些与

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

这将遍历arr每个元素,并检查tags数组是否包含toFind (如果存在,则将其打印出来)。

如果您想对整个阵列进行操作,请尝试此操作

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM