2017-06-14 159 views
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" : [] 
    }; 

的[0],[1]指标respresent和ID,但在这里,是不是真的很重要。

问题是,当我尝试用(我知道它只是试图筛选ARR [0]个大气压,但我会如此这般通过所有的指标写一个循环)对其进行过滤:

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]这些完整的对象。

希望我的问题很清楚,我提供了足够的信息。如果你们需要更多信息,请随时向我咨询。或者,如果你想要我澄清的事情,只是问:)

希望你们能帮助我!

+0

'arr.filter(X => x.tags.includes(找到相当))' – haim770

+0

的Object.prototype中没有一个filter()方法,这就是你用arr [0]访问的内容。你只是想过滤ARR本身 – dgeare

+0

谢谢你们现在的作品,现在感谢所有的快速回复!我用dgeare的解决方案!它的作品奇观:) –

回答

0

就像已经说了,编曲[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);

+0

非常感谢这个作品的奇迹! :D –

+0

@DennisJansen欢迎。乐意帮助^ _ ^ – dgeare

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

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

0

如果我正确地解释你的问题,看来你想沿着

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

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

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); 
相关问题