Tengo dos matrices:
[{name: "Darin", id: "123"}, {name: "Mads", id: "345"}, {name: "Kenneth", id: "543"}, {name: "June", id: "567"}, {name: "June (1)", id: "789"}][{name: "Darin", id: "910"}, {name: "June", id: "911"}, {name: "Simon", id: "912"}, {name: "Justin", id: "913"}]La salida que quiero es la siguiente:
[{name: "Darin", id: "123"}, {name: "Mads", id: "345"}, {name: "Kenneth", id: "543"}, {name: "June", id: "567"}, {name: "June (1)", id: "789"}, {name: "Darin (1)", id: "910"}, {name: "June (2)", id: "911"}, {name: "Simon", id: "912"}, {name: "Justin", id: "913"}]Como puedes ver, tengo las siguientes reglas:
No estoy seguro de por dónde empezar para lograr lo anterior. Puedo ver esto resuelto con un montón de bucles y una función recursiva, pero en realidad, eso es ineficiente.
Puedo ver que Javascript ES6 ofrece algunos métodos "más nuevos" que podrían resultar útiles en este escenario, en particular map and set .
En consecuencia, mi pregunta busca comprender cómo puedo lograr lo anterior, prestando atención a la complejidad del tiempo.
Podrías contar los nombres separando las cadenas.
const array1 = ["Darin", "Mads", "Kenneth", "June", "June (1)"], array2 = ["Darin", "June", "Simon", "Justin"], counts = {}, result = [array1, array2].reduce((r, a) => { a.forEach(v => { const [, name, , count = 0] = v.match(/^(\w*)(\s\((\d+)\))?$/); if (name in counts && count === 0) ++counts[name]; else counts[name] = count; r.push(counts[name] ? `${name} (${counts[name]})` : name); }); return r; }, []); console.log(result); .as-console-wrapper { max-height: 100% !important; top: 0; }Usando Array.map y un objeto de contador para realizar un seguimiento de la cantidad de veces que ya se produjo cada nombre:
var input1 = [{name: "Darin", id: "123"}, {name: "Mads", id: "345"}, {name: "Kenneth", id: "543"}, {name: "June", id: "567"}, {name: "June (1)", id: "789"}]; var input2 = [{name: "Darin", id: "910"}, {name: "June", id: "911"}, {name: "Simon", id: "912"}, {name: "Justin", id: "913"}]; var counter = {}; var combined = input1.concat(input2).map(function(e) { var strippedName = e.name.replace(/ \([0-9]+\)/, ''); counter[strippedName] = counter[strippedName] == undefined ? 0 : counter[strippedName] + 1; e.name = strippedName + (counter[strippedName] ? ' ('+counter[strippedName]+')' : ''); return e; }); console.log(combined);