[英]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.