मेरे पास दो सरणियाँ हैं और परिणाम को data
सरणी से फ़िल्टर करना चाहते हैं।
var data = [{"role":"Frontend", "languages": ["HTML", "CSS", "JavaScript"]},{"role":"Fullstack", "languages": ["JavaScript"]}]
var selectItem = ["CSS"];
एक बार यूआई से data
चुने जाने के बाद ऑब्जेक्ट्स को selectItem[] में जोड़ दिया जाता है।
मैं data
सरणी से selectItem
के विरुद्ध फ़िल्टर करके आउटपुट करना चाहता हूं।
लेकिन selectItem
में role
और languages
दोनों के मान हो सकते हैं।
पसंद:
var selectItem = ["Frontend","CSS"];
मैंने परिणाम को फ़िल्टर करने का प्रयास किया है:
var users = this.myJson.filter(
(el) =>
this.selectItem.includes(el.role) ||
el.languages.some((e1) => this.selectItem.indexOf(e1) >= 0)
);
console.log(users);
तो, कैसे एकाधिक कुंजियों के साथ data
सरणी को फ़िल्टर कर सकते हैं? यह क्वेरी languages
से फ़िल्टर कर रही है लेकिन role
से मानों को फ़िल्टर नहीं कर रही है।
अपडेट करें:
मैंने जिस क्वेरी की कोशिश की वह काम कर रही थी लेकिन जब चयनित आइटम पर नया आइटम जोड़ा जाता है जैसे:
var selectItem = ["Frontend","CSS", "HTML"];
यह अभी भी सभी मान लौटा रहा है क्योंकि इसमें CSS
है।
इसलिए मैं परिणाम को फ़िल्टर करना चाहता हूं यदि इसमें CSS
और HTML
और Frontend
data
के सभी टैग शामिल हैं।
var data = [
{"role":"Frontend", "languages": ["HTML", "CSS", "JavaScript"]},
{"role":"Fullstack", "languages": ["JavaScript"]},
{"role":"Frontend", "languages": ["CSS","JavaScript"]}
]
var selectItem = ["Frontend","CSS", "HTML"];
var users=data.filter(el => selectItem.length &&
(selectItem.includes(el.role) ||
el.languages.some(e1 => selectItem.includes(e1)) )
);
console.log(users);
मेरा अपेक्षित आउटपुट है:
[{
languages: ["HTML", "CSS", "JavaScript"],
role: "Frontend"
}]
सरणी वस्तु से एकाधिक कुंजियों के साथ फ़िल्टर करने का सबसे अच्छा तरीका क्या है?
2 जवाब
आपके पहले प्रयास से मैंने जो पढ़ा, उसके विपरीत, आप उन तत्वों की तलाश कर रहे हैं जो कीवर्ड-शर्तों के सभी को पूरा करते हैं, न कि उनमें से कुछ को। इस आवश्यकता को पूरा करने के लिए मैंने अपना उत्तर फिर से बदल दिया:
var data = [
{"role":"Frontend", "languages": ["HTML", "CSS", "JavaScript"]},
{"role":"Fullstack", "languages": ["JavaScript"]},
{"role":"Frontend", "languages": ["CSS","JavaScript"]}];
var sel = ["Frontend","CSS","HTML"];
var users=data.filter(el => {
if (sel&&sel.length){
// let elall=[el.role].concat(el.languages);
let elall=[el.role,...el.languages]; // <-- Aakash Bashyal <3
return sel.every(se=>elall.includes(se))
}
});
console.log(users);
मेरे कोड में मैं एक स्थानीय अस्थायी सरणी elall
बनाता हूं जिसमें दोनों विशेषताओं (role
और languages
) के तत्व में सभी कीवर्ड शामिल हैं। अब, .every()
विधि sel
पर जांच करती है कि क्या sel
में हर कीवर्ड elall
सरणी में पाया जाता है।
यह वांछित परिणाम देगा:
data.filter(d =>
selectItem.includes(item => item == d.role) ||
selectItem.some(item => d.languages.find(lang => lang == item))
);