मेरे पास दो सरणियाँ हैं और परिणाम को 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"
}]

सरणी वस्तु से एकाधिक कुंजियों के साथ फ़िल्टर करने का सबसे अच्छा तरीका क्या है?

0
Aakash Bashyal 15 सितंबर 2020, 19:55

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 सरणी में पाया जाता है।

1
cars10m 16 सितंबर 2020, 10:19

यह वांछित परिणाम देगा:

data.filter(d => 
    selectItem.includes(item => item == d.role) || 
    selectItem.some(item => d.languages.find(lang => lang == item))
);

0
aRvi 15 सितंबर 2020, 20:08