const data = require('./data') let arr = data .split(/\n/g).filter(Boolean) .map(l => l.replace(')','').split(' (contains ')) .map(l => [l[0].split(' '), l[1].split(', ')]) const ingredients = {} const allergens = {} for (let i=0; i { const iv = Object.entries(ingredients).filter(i => allergen.every(a => i[1].includes(a))) if (iv) { variants[Object.keys(allergens)[i]] = iv } }) while (Object.values(variants).some(iv => iv.length > 1)) { Object.entries(variants).forEach(iv => { if (iv[1].length === 1) { Object.keys(variants).forEach(ik => { if (ik !== iv[0]) { variants[ik] = variants[ik].filter(x => x[0] != iv[1][0][0]) } }) } }) } const result = Object.entries(variants) .sort((a, b) => a[0].localeCompare(b[0])) .map(r => r[1][0][0]) .join(',') console.log('Answer: ', result)