Ejemplo 1: tengo una matriz como esta
let arrayA = ["task A - memberA", "task A - memberB", "task B - memberA"]Quiero saber si dos miembros están haciendo la misma tarea, luego elimino la tarea de la siguiente. El resultado esperado del Ejemplo 1 debería ser:
arrayA = ["task A - memberA", "task B - memberA"]Ejemplo 2:
let arrayA = [{task: "Task A", member: "MemberA"},{task: "Task A", member: "MemberB"},{task: "Task B", member: "MemberB"}]Resultado esperado 2:
arrayA = [{task: "Task A", member: "MemberA"},{task: "Task B", member: "MemberB"}]Gracias,
Cree un Set que realice un seguimiento de las tareas activas.
Luego, recorra la matriz de tasks y extraiga la task dividiendo la cadena y luego, si la task no está presente en el Set , empújela a la matriz resultante.
let tasks = ["task A - memberA", "task A - memberB", "task B - memberA"]; function getUniqueTasks(tasks) { const activeTasks = new Set(); const uniqueTasks = []; tasks.forEach((t) => { const [task] = t.split(" - "); if (!activeTasks.has(task)) { uniqueTasks.push(t); activeTasks.add(task); } }); return uniqueTasks; } console.log(getUniqueTasks(tasks));Si está buscando un trazador de líneas elegante, consulte la solución a continuación:
const data = ["task A - memberA", "task A - memberB", "task B - memberA"], filterer = (s) => (d, _i, _a, t = d.split(" - ")[0]) => !s.has(t) && s.add(t), result = data.filter(filterer(new Set())); console.log(result);Documentaciones relevantes:
usando el método de reducción,
pista :
algún método devuelve verdadero o falso
incluye el método devuelve verdadero o falso
El método substr devuelve la subcadena de la cadena, es decir, el nombre de la tarea.
consulte los tutoriales de MDN para obtener más detalles
let arr = ["task A - memberA", "task A - memberB", "task B - memberA"] let result = arr.reduce((pv,cv) => { if(!pv.some(e => e.includes(cv.substr(0, cv.indexOf('-')).trim()))) pv.push(cv) return pv },[]) console.log(result) para el segundo ejemplo simplemente reemplace
if(!pv.some(e => e.task.includes(cv.task.trim()))) pv.push(cv)
Podría tomar un Set y una función para la parte única deseada de la cadena.
const getTask = s => s.split(' - ', 1)[0], uniqueBy = fn => s => v => (w => !s.has(w) && s.add(w))(fn(v)), data = ["task A - memberA", "task A - memberB", "task B - memberA"], result = data.filter(uniqueBy(getTask)(new Set)); console.log(result);