I have two arrays of objects: inputData
and jobList
. I have to compare the primarySkills array of both the array of objects and return only those values which are matching in both the array.My array of objects are as below:
let inputData = [ { "candidateID": "911772331", "skillSet": ["Information Technology"], "addressCity": "Bengaluru", "addressState": "KA", "country": "India", "primarySkills": ['asp.net', 'react', 'javascript'], "secondarySkills": ['powerbi', 'redux'], "preferredPositionType": [], } ] let jobList = [ { jobId: '600039355', jobType: 'fulltime', primarySkills: [ 'asp.net','node' ], secondarySkills: [ 'javascript' ], skillSet: [ 'javascript' ], Address: 'Indonesia, Bekasi Kabupaten, 53, Jalan Londan 5', City: 'Bekasi Kabupaten', State: 'JABODETABEK', Zipcode: '17522', Country: 'Indonesia' }, { jobId: '562190375', jobType: 'fulltime', primarySkills: [ 'javascript','mainframe' ], secondarySkills: [ 'javascript' ], skillSet: [ 'javascript' ], Address: 'India, Pune, 411001, Pune, Pune Station', City: 'Pune', State: 'MH', Zipcode: '411001', Country: 'India' }, { jobId: '883826845', jobType: 'fulltime', primarySkills: [ 'sqlserver', 'react', 'powershell' ], secondarySkills: [ 'powerbi' ], skillSet: [ 'powerbi' ], Address: 'ประเทศไทย, หมู่ที่ 3, 1234', City: 'หมู่ที่ 3', State: null, Zipcode: '57110', Country: 'ประเทศไทย' } ]
I have done the below mentioned code to achieve this:
jobList.forEach((item) => { inputData.forEach((data) => { for (let i = 0; i <= item.primarySkills.length; i++) { for (let j = 0; j <= data.primarySkills.length; j++) { if (item.primarySkills[i] === data.primarySkills[j]) { PMSkill.push(item.primarySkills[i]); } else { PMSkill.push(0) } } } }) }) Expected output to be like in the PMSkill array: let PMSkill= [ { jobId: '600039355', jobType: 'fulltime', primarySkills: [ 'asp.net'],----here asp.net is the only skill matching with inputData primarySkill secondarySkills: [ 'javascript' ], skillSet: [ 'javascript' ], Address: 'Indonesia, Bekasi Kabupaten, 53, Jalan Londan 5', City: 'Bekasi Kabupaten', State: 'JABODETABEK', Zipcode: '17522', Country: 'Indonesia' }, { jobId: '562190375', jobType: 'fulltime', primarySkills: [ 'javascript'], secondarySkills: [ 'javascript' ], skillSet: [ 'javascript' ], Address: 'India, Pune, 411001, Pune, Pune Station', City: 'Pune', State: 'MH', Zipcode: '411001', Country: 'India' }, { jobId: '883826845', jobType: 'fulltime', primarySkills: ['react'], secondarySkills: [ 'powerbi' ], skillSet: [ 'powerbi' ], Address: 'ประเทศไทย, หมู่ที่ 3, 1234', City: 'หมู่ที่ 3', State: null, Zipcode: '57110', Country: 'ประเทศไทย' } ]
Advertisement
Answer
function getIntersection(x, y) { // ensure two arrays ... const [ comparisonBase, // ... the shorter one as comparison base comparisonList, // ... the longer one to filter from. ] = [[...x], [...y]] .sort((a, b) => a.length - b.length); // create a `Map` based lookup table from the shorter array. const itemLookup = comparisonBase .reduce((map, item) => map.set(item, true), new Map) // the intersection is the result of following filter task. return comparisonList.filter(item => itemLookup.has(item)); } const inputData = [{ "candidateID": "911772331", "skillSet": ["Information Technology"], "addressCity": "Bengaluru", "addressState": "KA", "country": "India", "primarySkills": ['asp.net', 'react', 'javascript'], "secondarySkills": ['powerbi', 'redux'], "preferredPositionType": [], }]; const jobList = [{ jobId: '600039355', jobType: 'fulltime', primarySkills: [ 'javascript' ], secondarySkills: [ 'javascript' ], skillSet: [ 'javascript' ], Address: 'Indonesia, Bekasi Kabupaten, 53, Jalan Londan 5', City: 'Bekasi Kabupaten', State: 'JABODETABEK', Zipcode: '17522', Country: 'Indonesia' }, { jobId: '562190375', jobType: 'fulltime', primarySkills: [ 'javascript' ], secondarySkills: [ 'javascript' ], skillSet: [ 'javascript' ], Address: 'India, Pune, 411001, Pune, Pune Station', City: 'Pune', State: 'MH', Zipcode: '411001', Country: 'India' }, { jobId: '883826845', jobType: 'fulltime', primarySkills: [ 'sqlserver', 'azure', 'powershell' ], secondarySkills: [ 'powerbi' ], skillSet: [ 'powerbi' ], Address: 'ประเทศไทย, หมู่ที่ 3, 1234', City: 'หมู่ที่ 3', State: null, Zipcode: '57110', Country: 'ประเทศไทย' }]; const candidateSkills = inputData[0].primarySkills; const openJobsSkills = [...new Set( jobList.reduce((arr, { primarySkills }) => arr.concat(primarySkills), []) )]; const skillIntersection = getIntersection(openJobsSkills, candidateSkills); console.log({ candidateSkills, openJobsSkills, skillIntersection });
.as-console-wrapper { min-height: 100%!important; top: 0; }
Edit according to the OP’s more detailed further request
“I want to compare the
inputData.primarySkills
one by one with each list of objects injobList
and update the matching skills against theprimarySkills
field ofjobList
.”
In this case one needs a task which forEach
item of jobList
reassigns it’s primarySkills
property value with the property specific intersection with the base primarySkills
array taken from inputData
.
The provided solution makes use of forEach
and its 2nd thisArg
argument in order to decouple the functionality from outside scope references/dependencies.
Depending on whether one needs to leave jobList
un-mutated/untouched, on might be in need of an additional mapping task which has to create a deep clone of each jobList
item.
function getIntersection(x, y) { // ensure two arrays ... const [ comparisonBase, // ... the shorter one as comparison base comparisonList, // ... the longer one to filter from. ] = [[...x], [...y]] .sort((a, b) => a.length - b.length); // create a `Map` based lookup table from the shorter array. const itemLookup = comparisonBase .reduce((map, item) => map.set(item, true), new Map) // the intersection is the result of following filter task. return comparisonList.filter(item => itemLookup.has(item)); } const inputData = [{ "candidateID": "911772331", "skillSet": ["Information Technology"], "addressCity": "Bengaluru", "addressState": "KA", "country": "India", "primarySkills": ['asp.net', 'react', 'javascript'], "secondarySkills": ['powerbi', 'redux'], "preferredPositionType": [], }]; const jobList = [{ jobId: '600039355', jobType: 'fulltime', primarySkills: [ 'asp.net','node' ], secondarySkills: [ 'javascript' ], skillSet: [ 'javascript' ], Address: 'Indonesia, Bekasi Kabupaten, 53, Jalan Londan 5', City: 'Bekasi Kabupaten', State: 'JABODETABEK', Zipcode: '17522', Country: 'Indonesia' }, { jobId: '562190375', jobType: 'fulltime', primarySkills: [ 'javascript','mainframe' ], secondarySkills: [ 'javascript' ], skillSet: [ 'javascript' ], Address: 'India, Pune, 411001, Pune, Pune Station', City: 'Pune', State: 'MH', Zipcode: '411001', Country: 'India' }, { jobId: '883826845', jobType: 'fulltime', primarySkills: [ 'sqlserver', 'react', 'powershell' ], secondarySkills: [ 'powerbi' ], skillSet: [ 'powerbi' ], Address: 'ประเทศไทย, หมู่ที่ 3, 1234', City: 'หมู่ที่ 3', State: null, Zipcode: '57110', Country: 'ประเทศไทย' }]; function updatePrimarySkillsWithIntersectionOfBoundBaseSkills(jobItem) { const basePrimarySkills = this; jobItem.primarySkills = getIntersection(jobItem.primarySkills, basePrimarySkills); } // if needed ... create new array with real `jobItem` clones ... const pmSkillList = jobList.map(jobItem => JSON.parse(JSON.stringify(jobItem)) ); // ... otherwise (`jobList.forEach`) ... just ... // .... reassign the item specific `primarySkills` property value. pmSkillList.forEach( // the callback updatePrimarySkillsWithIntersectionOfBoundBaseSkills, // the 2nd `thisArg` argument inputData[0].primarySkills, ); // log any involved data. console.log({ inputData, jobList, pmSkillList });
.as-console-wrapper { min-height: 100%!important; top: 0; }