Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

84
Visualizações
Objeto de actualización de Javascript desde una cadena

Tengo este objeto {country:{town:{company:{boss:{}}}}} y esta cadena country.town.cityhouse.major , necesito actualizar el objeto de la cadena, pero manteniendo las propiedades y datos anteriores .

 { country: { town: { company: { boss: {} }, cityhouse: { major: {} } } } }

Esto es lo que tengo hasta ahora:

 function updateObj(object, path) { const newPath = path.split('.'); let temp = {...object}; for (let i = 0; i < newPath.length; i++) { let mid = temp[newPath[i]]; if (mid) { temp = mid; } else { temp[newPath[i]] = {}; } } return temp; } const obj = { country: { town: { company: { boss: {} }}}}; const r = updateObj(obj, 'country.town.cityhouse.major'); console.log(r);

pero responde:

 { company: { boss: {} }, cityhouse: {}, major: {} }

¿Alguna pista sobre esto?

about 4 years ago · Juan Pablo Isaza
3 Respostas
Responde à pergunta

0

Puede limpiar esto un poco usando la asignación lógica nula (??=) y un bucle for...of .

 function updateObj(object, path) { let result = { ...object }; let temp = result; for (const k of path.split('.')) { temp = temp[k] ??= {}; } return result; } const obj = { country: { town: { company: { boss: {} } } } }; const r = updateObj(obj, 'country.town.cityhouse.major'); console.log(r);
 .as-console-wrapper { max-height: 100% !important; top: 0; }

opción recursiva

 function updateObj(object, path) { const result = { ...object }; const [prop, ...pathArr] = path.split('.'); result[prop] = pathArr.length ? updateObj((result[prop] ??= {}), pathArr.join('.')) : (result[prop] ??= {}); return result; } const obj = { country: { town: { company: { boss: {} } } } }; const r = updateObj(obj, 'country.town.cityhouse.major'); console.log(r);
 .as-console-wrapper { max-height: 100% !important; top: 0; }

about 4 years ago · Juan Pablo Isaza Relatório

0

Este código normalmente se escribiría de forma recursiva, por lo que debe tener una variable para mantener el alcance actual (la ruta que recorrió a través del objeto) para hacer el trabajo, por lo que creé la variable llamada scope para hacer ese trabajo.

 function updateObj(object, path) { const newPath = path.split('.'); let temp = {...object}; let scope = temp; for (let i = 0; i < newPath.length; i++) { let cur = scope[newPath[i]]; if (!cur) { scope = scope[newPath[i]] = {}; } else { scope = cur; } } return temp; } const obj = { country: { town: { company: { boss: {} }}}}; const r = updateObj(obj, 'country.town.cityhouse.major'); console.log(r);

Esta es una implementación recursiva, pero dado que requiere copiar el objeto y pasarlo a la siguiente llamada recursiva, no es eficiente. Si encuentro una implementación mejor y más eficiente, la actualizaré.

 function updateObjRec(object, path, depth = 0) { // base case // if depth is equal to path length then it's over if (depth === path.length) { return {}; } const cur = path[depth]; const scope = object[cur]; // here we have 2 cases // current field already exists update = {}; if (scope) { update = updateObjRec({ ...scope}, path, depth + 1); } else { update = updateObjRec({}, path, depth + 1); } // merge with given object object[cur] = update; return object } const obj = { country: { town: { company: { boss: {} }}}}; const r = updateObjRec(obj, 'country.town.cityhouse.major'.split('.')); console.log(r);

Actualizar El código recursivo se puede reescribir de esta manera para que sea más eficiente

 function updateObj(obj, path) { const temp = { ...obj }; const p = path.split('.'); const updateRec = (scope, depth = 0) => { // base case if (depth === p.length) return; const cur = p[depth]; if (!scope[cur]) { scope[cur] = {}; } updateRec(scope[cur], depth + 1); } updateRec(temp); return temp; } const obj = { country: { town: { company: { boss: {} }}}}; const r = updateObj(obj, 'country.town.cityhouse.major'); console.log(r);

about 4 years ago · Juan Pablo Isaza Relatório

0

Esto no es ideal, pero es un comienzo. Básicamente, estás devolviendo la temperatura, que es la capa más baja. desea devolver la raíz. Además, cuando no puede encontrar la siguiente capa, la estaba creando, pero no estaba actualizando la temperatura.

 function updateObj(object, path) { const newPath = path.split('.'); let temp = {...object}; const result = temp; // need to return this for (let i = 0; i < newPath.length; i++) { let mid = temp[newPath[i]]; if (mid) { temp = mid; } else { temp[newPath[i]] = {}; temp = temp[newPath[i]] // need this } } return result; } const obj = { country: { town: { company: { boss: {} }}}}; const r = updateObj(obj, 'country.town.cityhouse.major'); console.log(r);

about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda