Tengo una matriz 2D como esta en JavaScript:
result=[["user1", "java"], ["user2", "python"],["user1", "java"], ["user1", "C++"], ["user1", "java"], ["user2", "Python"]....] puede ver que ["user1", "java"] aparece 3 veces y ["user2", "python"] 2 veces.
Quiero limpiar esta matriz para que cada par de elementos aparezcan solo una vez. Significa que si "usuario1" puede aparecer nuevamente, debería ser con otro idioma pero no con "java". ¿alguien me puede ayudar?
Podrías probar con este:
let result= [ ["user1", "java"], ["user2", "python"], ["user1", "java"], ["user1", "C++"], ["user1", "java"], ["user2", "Python"] ]; const map = new Object(); result.forEach((item) => { if(!map[item[0]]){ map[item[0]] = new Array(); } const user = map[item[0]]; const language = (item[1] || '').toLowerCase().trim(); if(user.indexOf(language) < 0){ user.push(language); } }); result = new Array(); Object.keys(map).forEach((user) => { map[user].forEach((language) => { result.push([user,language]); }); }); console.log(result);Puede crear un Set a partir de la matriz uniendo las cadenas de usuario y de idioma, lo que eliminaría los duplicados. Y luego simplemente divida las cadenas para obtener la matriz deseada.
const result = [["user1", "java"], ["user2", "python"], ["user1", "java"], ["user1", "c++"], ["user1", "java"], ["user2", "python"]], uniques = Array.from(new Set(result.map((res) => res.join("-")))).map( (data) => data.split("-") ); console.log(uniques);Documentaciones relevantes:
Puede hacer esto con un solo bucle sobre la matriz usando reduce , join y Set as:
const result = [ ['user1', 'java'], ['user2', 'python'], ['user1', 'java'], ['user1', 'C++'], ['user1', 'java'], ['user2', 'python'], ]; const [uniqueElements] = result.reduce((acc, curr) => { const [uniq, set] = acc; if (!set.has(curr.join(','))) { set.add(curr.join(',')); uniq.push(curr); } return acc; }, [[], new Set()], ); console.log(uniqueElements); /* This is not a part of answer. It is just to give the output full height. So IGNORE IT */ .as-console-wrapper { max-height: 100% !important; top: 0; }