2017-06-14 14 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が、それはここでは本当に重要ではありません。

私は(私が知っている、それが唯一の気圧[0] ARRフィルタリングしようとしますが、それはすべてのインデックスを通過するので、私はループを記述します)でそれをフィルタ処理しようとすると、問題がある:

var toFind = "offline"; 

var filtered = arr[0].filter(function(el) { 
    return el.tags === toFind; 
}); 

console.log(filtered); 

それは、 arr [0] .filterは関数ではありませんが、なぜarr [0]を関数として考慮する必要があると考えられるのか分かりません。

私は[0]、それは空白の配列をバック与える...

を削除するだから私の質問は、私は、タグ配列でタグに基づいて完全なオブジェクトをお返しする.filter機能を得ることができる方法です。だから私が "学校"というタグを検索すると、それはarr [1]とarr [2]という完全なオブジェクトを返します。

希望私は私の質問はクリスタルクリアであり、十分な情報を提供しました。あなたにもう少しの情報が必要な場合は、私にそれを求めてください。または、私に物事を明確にしたい場合は、ちょうど質問してください:)

あなたは私を助けることを願っています!

+0

'arr.filter(X => x.tags.includes(toFind))を試す' – haim770

+0

のObject.prototypeはありません。あなたがarr [0]でアクセスしているものであるfilter()メソッド。 arrそのものをフィルタリングしたいだけです – dgeare

+0

すみません、ありがとうございました。私はデジアのソリューションを使用しました!それは不思議に動作します:) –

答えて

0

などが言われてきた、ARR [0]のフィルタ方法を持っていないオブジェクトへのポイント。あなたは、私が正しくあなたの質問を解釈していた場合、あなたがこの意志ループ

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

の線に沿って何かをしたいと思われる配列自体

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

documentionに参照のうえ: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の各要素を介して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); 
関連する問題