2017-06-14 216 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); 
相關問題