javascript एक साधारण लूप का उपयोग करके सरणी वस्तुओं को कैसे प्रदर्शित करें और यदि कथन हैं?




loops if-statement (2)

मुझे 3 सरणियाँ और सरल लूप की एक जोड़ी मिली है। मैं 3 शर्तों को निर्दिष्ट करना चाहता हूं जो 2000 से अधिक वेतन वाले वेब डेवलपर की स्थिति में वारसा के एक व्यक्ति को दिखाएगा। समस्या यह है कि यह एक के बजाय दो रिकॉर्ड दिखाता है।

मैंने प्रत्येक लूप के अंदर स्थितियां लिखने की कोशिश की है, लेकिन मेरे किसी भी संयोजन ने काम नहीं किया।

var people = [
    {'name': 'Viola',   'salary': 2500, 'surname': 'Smith'},
    {'name': 'Boris',   'salary': 1300, 'surname': 'Popkovitch'},
    {'name': 'John',    'salary': 500, 	'surname': 'Lynn'},
    {'name': 'Tom', 	'salary': 3300, 'surname': 'Gates'},
    {'name': 'Levis', 	'salary': 900,  'surname': 'Klark'}, 
];

var workplace = [
    {'city': 'New York', 	'persons': ['Viola']},
    {'city': 'Manchester', 	'persons': ['John', 'Boris']},
    {'city': 'Warsaw', 		'persons': ['Tom', 'Levis']},
];

var job = [
    {'position': 'Head manager',    'workers': ['Boris']},
    {'position': 'Web developer',   'workers': ['Tom', 'Viola']},
    {'position': 'Principal',       'workers': ['Levis', 'John']}
];

var array = [];

for (var x = 0; x < people.length; x++) {
  for (var y = 0; y < workplace.length; y++) {
    for (var z = 0; z < job.length; z++) {
      if (workplace[y].city === 'Warsaw' && job[z].position === 'Web developer' && people[x].salary > 2000) {
        array.push(people[x]);
      }
    }
  }
};


console.log(array);

मुझे उम्मीद है कि कोड केवल टॉम ऑब्जेक्ट को लौटाएगा, टॉम और वायोला को नहीं। कोई उपाय?


यदि people[x].name workplace[y].persons और job[z].workers workplace[y].persons में है तो आपको परीक्षण करने की आवश्यकता है।

var people = [
    {'name': 'Viola',   'salary': 2500, 'surname': 'Smith'},
    {'name': 'Boris',   'salary': 1300, 'surname': 'Popkovitch'},
    {'name': 'John',    'salary': 500, 	'surname': 'Lynn'},
    {'name': 'Tom', 	'salary': 3300, 'surname': 'Gates'},
    {'name': 'Levis', 	'salary': 900,  'surname': 'Klark'}, 
];

var workplace = [
    {'city': 'New York', 	'persons': ['Viola']},
    {'city': 'Manchester', 	'persons': ['John', 'Boris']},
    {'city': 'Warsaw', 		'persons': ['Tom', 'Levis']},
];

var job = [
    {'position': 'Head manager',    'workers': ['Boris']},
    {'position': 'Web developer',   'workers': ['Tom', 'Viola']},
    {'position': 'Principal',       'workers': ['Levis', 'John']}
];

var array = [];

for (var x = 0; x < people.length; x++) {
  for (var y = 0; y < workplace.length; y++) {
    for (var z = 0; z < job.length; z++) {
      if (workplace[y].city === 'Warsaw' && job[z].position === 'Web developer' && people[x].salary > 2000 
        && job[z].workers.includes(people[x].name) 
        && workplace[y].persons.includes(people[x].name)) {
        array.push(people[x]);
      }
    }
  }
};


console.log(array);


आपका कोड वास्तव में क्या करता है: यदि शहर 'वारसॉ' सूची में मौजूद है और सूची में 'वेब डेवलपर' मौजूद है, तो मुझे 2k से अधिक वेतन वाले सभी लोग प्राप्त करें। चूँकि आपके नमूना डेटा ( tautology ) पर पहली दो स्थितियाँ सत्य हैं, आपके द्वारा लिखा गया कोड सूची से सभी लोगों को 2k से अधिक वेतन के साथ लौटाता है, जो कि आपने देखा और यहाँ समाप्त हो गया।

इस बिंदु पर मैं आपको यह सोचने का सुझाव दूंगा कि क्या आपके पास जो डेटा संरचना है, वह उन मानदंडों से लोगों को फ़िल्टर करने के लिए उपयुक्त है। लेकिन मान लें कि आपको वर्तमान डेटा प्रतिनिधित्व के साथ रहना होगा। इसके अलावा आपके द्वारा लिखे गए कोड और बरमार की नकल अविश्वसनीय रूप से अक्षम है। इस तरह के कार्य को पूरा करने के लिए मानव (विवेकपूर्ण) मानव क्या करेगा:

  1. कार्यक्षेत्रों की सूची में 'वारसॉ' का पता लगाएँ और इसे एक मार्कर पेन से उजागर करें; जाना 8. , अगर नहीं मिला।
  2. नौकरियों की सूची में 'वेब डेवलपर' का पता लगाएँ और इसे एक मार्कर पेन से उजागर करें; जाना 8. , अगर नहीं मिला।
  3. वेतन के साथ पहला व्यक्ति खोजें> 2000; जाना 8. , अगर नहीं मिला।
  4. हाइलाइट किए गए शहर की व्यक्ति सूची में लुकअप व्यक्ति का नाम; जाना 8. , अगर नहीं मिला।
  5. हाइलाइट की गई नौकरी की कार्यकर्ता सूची में लुकअप व्यक्ति का नाम; जाना 8. , अगर नहीं मिला।
  6. हाँ, मुझे एक रिकॉर्ड मिला है जो मापदंड से मेल खाता है, इसे आउटपुट पर धकेलें!
  7. वेतन के साथ अगला व्यक्ति खोजें> 2000; 4. जाना, अगर पाया।
  8. किया हुआ!

क्या आपने ऊपर एल्गोरिथ्म में कोई लूप देखा? खैर, कुछ लोग कहेंगे कि लूप वहां छिपे हैं। और यह सच है, लेकिन आजकल हमारे पास उच्चतर कार्य हैं (मुझे आशा है कि आप पायथन कोड को बुरा नहीं मानते हैं) जो बिल्कुल वैसा ही करते हैं - उनमें लूप छिपाते हैं। इस तरह के एक समारोह का एक उदाहरण Array.Filter । यह कॉलबैक (प्रतिनिधि, लैम्ब्डा, विधेय, तीर फ़ंक्शन, कॉलिटवहाटयॉवंट ...) तर्क लेता है जो कि सरणी में प्रत्येक तत्व के लिए एक बार निष्पादित होता है ताकि वे सरणी में दिखाई दें। कॉलबैक यह तय करता है कि परिणामी सरणी में विशिष्ट तत्व को रखा जाना चाहिए या नहीं। फ़ंक्शन का परिणाम तत्वों से भरा एक नया सरणी है, जिसके लिए कॉलबैक फ़ंक्शन true लौटा true । आइए इस फ़ंक्शन पर निर्माण शुरू करें।

const array = people.filter(person => person.salary > 2000);

यहाँ मैंने पैरामीटर के रूप में एक तीर फ़ंक्शन पारित किया, क्योंकि इसकी संक्षिप्त सिंटैक्स। कोड की यह लाइन प्रभावी रूप से ऊपर एल्गोरिथ्म के #3 और #7 को लागू करती है। यहाँ चरण #1 और #2 के लिए कोड है:

const warsaw = workplace.find(aWorkplace => aWorkplace.city === 'Warsaw');
const webDeveloper = workplace && job.find(aJob => aJob.position === 'Web developer');

मैंने आवश्यक रिकॉर्ड का पता लगाने के लिए Array.find फ़ंक्शन का उपयोग किया। यह निश्चित रूप से, मान लेता है कि शहर का नाम और स्थिति का नाम सरणी के भीतर अद्वितीय है। क्या आप अभी भी डेटा संरचनाओं के बारे में उस बिंदु को याद करते हैं? लेकिन कोई बात नहीं, चलो इसे एक तरफ छोड़ दें। workplace && दूसरी पंक्ति में 'वॉरसॉ' नहीं मिलने की स्थिति में व्यर्थ लुकअप को रोकने के लिए है। अब इसे एक साथ रखने के लिए:

const warsaw = workplace.find(aWorkplace => aWorkplace.city === 'Warsaw');
const webDeveloper = workplace && job.find(aJob => aJob.position === 'Web developer');
const array = (warsaw && webDeveloper && people.filter(person =>
  person.salary > 2000 &&
  warsaw.persons.includes(person.name) &&
  webDeveloper.workers.includes(person.name)
)) || [];

मुझे पता है कि मैं warsaw && को तीसरी पंक्ति में छोड़ सकता था, लेकिन मैं तर्क में "पहेली" नहीं लाने के लिए इसे वहां रखना पसंद करता हूं।

तो हमने यहाँ क्या सीखा है? हमें इससे क्यों गुजरना पड़ा? यदि आप मूल फ़ोर-लूप आधारित कोड की तुलना ऊपर वाले से करते हैं, तो आपको जल्दी से पता चल जाएगा कि उत्तरार्द्ध अधिक पठनीय है, क्योंकि यह मूल रूप से सादे अंग्रेजी में लिखा गया है और अधिक कुशल है, क्योंकि यह अनावश्यक कदम उठाने से बचता है। और एक बोनस के रूप में शायद आज का दिन था जब आपने उच्च क्रम के कार्यों और तीर के कार्यों के बारे में कुछ सीखा।

यहाँ स्निपेट है।

var people = [
    {'name': 'Viola',   'salary': 2500, 'surname': 'Smith'},
    {'name': 'Boris',   'salary': 1300, 'surname': 'Popkovitch'},
    {'name': 'John',    'salary': 500, 	'surname': 'Lynn'},
    {'name': 'Tom', 	'salary': 3300, 'surname': 'Gates'},
    {'name': 'Levis', 	'salary': 900,  'surname': 'Klark'}, 
];

var workplace = [
    {'city': 'New York', 	'persons': ['Viola']},
    {'city': 'Manchester', 	'persons': ['John', 'Boris']},
    {'city': 'Warsaw', 		'persons': ['Tom', 'Levis']},
];

var job = [
    {'position': 'Head manager',    'workers': ['Boris']},
    {'position': 'Web developer',   'workers': ['Tom', 'Viola']},
    {'position': 'Principal',       'workers': ['Levis', 'John']}
];

const warsaw = workplace.find(aWorkplace => aWorkplace.city === 'Warsaw');
const webDeveloper = workplace && job.find(aJob => aJob.position === 'Web developer');
const array = (warsaw && webDeveloper && people.filter(person =>
    person.salary > 2000 &&
    warsaw.persons.includes(person.name) &&
    webDeveloper.workers.includes(person.name)
)) || [];

console.log(array);

मेरा अंतिम अवलोकन यह है कि आपने पहचानकर्ता people उपयोग किया है, जो कि बहुवचन का अर्थ है, और यह ठीक है, लेकिन शेष सूचियों के लिए आपने एकवचन संज्ञाओं का उपयोग किया - workplace और job । मैं आपको नामकरण निरंतरता रखने की सलाह दूंगा, क्योंकि यह कोड पठनीयता में भी सुधार करता है।





if-statement