मेरे पास उप-सरणी की एक सरणी है। प्रत्येक उपसरणी में कम से कम एक तत्व होता है जिसे कम से कम एक और उपसरणी में दोहराया जाता है। उदाहरण के लिए:
[
['aaa', 'bbb', 'ccc'],
['ddd', 'aaa'],
['aaa', 'bbb', 'ccc', 'eee'],
['kkk', 'mmm', 'nnn'],
['mmm', 'ooo']
]
इस मामले में 'ddd' और 'eee' को कहीं भी डुप्लिकेट नहीं किया गया है, लेकिन एक ही सबएरे में अन्य तत्वों को कम से कम एक और सबरे में डुप्लिकेट किया गया है। मुझे निम्नलिखित आउटपुट प्राप्त करने के लिए तत्वों को नए उप-सरणी में समूहित करने की आवश्यकता है:
[
['aaa', 'bbb', 'ccc', 'ddd', 'eee'],
['kkk', 'mmm', 'nnn', 'ooo']
]
दूसरे शब्दों में, मुझे "दोस्तों" को समूहित करने की आवश्यकता है। तो अगर 'आआ' के लिए कहीं 'डीडी' एक "दोस्त" है और अगर 'ईई' कहीं 'बीबीबी' के लिए दोस्त है और 'आ' और 'बीबीबी' भी दोस्त हैं, तो हम उन सभी को एक नए सबरे में समूहित करते हैं। लेकिन 'एमएमएम' 'आ', 'बीबीबी' आदि के लिए दोस्त नहीं है, लेकिन केकेके और एनएनएन और ओओ के लिए एक दोस्त है, इसलिए उन्हें दूसरे सबरे में समूहित करें
2 जवाब
आप पहले reduce
और Set
का उपयोग अद्वितीय मानों की एक सरणी प्राप्त करने के लिए कर सकते हैं और फिर map
इसे अद्वितीय मानों वाले सरणियों के लिए उपयोग कर सकते हैं।
const data = [
['aaa', 'bbb', 'ccc'],
['ddd', 'aaa'],
['aaa', 'bbb', 'ccc', 'eee'],
['kkk', 'mmm', 'nnn'],
['mmm', 'ooo']
]
const result = data.reduce((r, e) => {
const match = r.find(a => e.some(s => a.has(s)))
if (!match) r.push(new Set(e));
else e.forEach(el => match.add(el))
return r
}, []).map(e => Array.from(e))
console.log(result)
आप सेट का उपयोग कर सकते हैं और कम कर सकते हैं
- सरणी पर लूप करें, कुंजी के रूप में उपयोग करने के लिए वर्तमान मान में शामिल हों का उपयोग करें
- जांचें कि वर्तमान सरणी से कोई तत्व पहले से ही op पर मौजूद है या नहीं
- यदि पहले से मौजूद है तो मौजूदा सरणी को मौजूदा सेट में जोड़ें और सेट के रूप में वर्तमान सरणी के रूप में मान के साथ एक नई कुंजी पर सेट करें
let data = [['aaa', 'bbb', 'ccc'],['ddd', 'aaa'], ['aaa', 'bbb', 'ccc', 'eee'],['kkk', 'mmm', 'nnn'],['mmm', 'ooo']]
let final = data.reduce((op, inp) => {
let key = inp.join(',')
let included = Object.keys(op)
let found = included.find(v => inp.some(curr => v.includes(curr)))
if (found) {
op[found] = new Set([...op[found], ...inp])
} else {
op[key] = new Set(inp)
}
return op
}, {})
console.log(Object.values(final).map(v => [...v]))