javascript: comprueba la longitud de la matriz y envía o actualiza el objeto dentro

CorePress2024-01-16  12

Estoy realmente luchando con mi código y no puedo encontrar una manera de hacerlo funcionar.

Necesito verificar si mi matriz existe o si su longitud no es 0 y luego si hay un objeto con un valor específico en ella. Si es así, actualícelo. Si no, agréguelo. Por favor vea mi código a continuación:

const originals = [];

if (!originals || originals.length === 0) {
  originals.push({
    "name": "Michael",
    "age": 21,
    "gender": "male"
  });
} else {
  for (i = 0; i < originals.length; i++) {
    if (originals[i].name !== "Michael") {
      originals.push({
        "name": "Michael",
        "age": 21,
        "gender": "male"
      });
    }
    if (originals[i].name == "Michael" && originals[i].age == 21) {
      originals[i].age = 22;
    }
  }
  console.log(originals);
}

Muchas gracias por tu ayuda de antemano.

¿Qué pasa con Samantha? Ese código realmente no corresponde a la descripción de su problema. Parece que intentas realizar diferentes actualizaciones en el mismo código. Quizás centres tu pregunta en una sola cosa...

-trincot

19/03/2021 a las 20:04

¿Cuál es el resultado esperado?

- Triet Doan

19/03/2021 a las 20:04

Gracias. Déjame simplificar la matriz. Así es más fácil de entender.

-qqruza

19/03/2021 a las 20:06

Entonces, ¿cuál es la lógica con la edad? Entonces, ¿quieres sumar 21 años y luego detectar que es 21 y convertirlo en 22? Tu descripción no menciona nada sobre esta lógica.

-trincot

19/03/2021 a las 20:07

1

No puedes saber si el objeto con ese nombre existe hasta el final del ciclo. Tu'Vuelva a enviar el nuevo elemento para cada elemento que no coincida con los criterios, no solo si no está en ningún lugar de la matriz.

-Barmar

19/03/2021 a las 20:10



------------------------------------

Utilice el método find() para buscar un elemento con el nombre que desee. Si lo encuentra, actualícelo; de lo contrario, agregue el nuevo elemento.

No es necesario comprobar la longitud de la matriz. Si la matriz está vacía, find() no la encontrará.

let mike = originals.find(({name}) => name == 'Michael');
if (mike) {
    if (mike.age == 21) {
        mike.age = 22;
    }
} else {
    originals.push({
        "name": "Michael",
        "age": 21,
        "gender": "male"
    });
}

Esta solución supone que los nombres son únicos. Si puede haber varias entradas de Michael, puede usar filter() en lugar de find() para devolverlas todas.

2

Nit: Podrías convertir a Mike en constante. :-)

– Krisztián Balla

19/03/2021 a las 20:35

Una forma muy sencilla y eficaz de lograr mi objetivo con unas pocas líneas de código. Gracias @barmar

-qqruza

19/03/2021 a las 20:42



------------------------------------

Leyendo entre líneas lo que creo que quieres hacer es:

Si "Michael" está en la matriz. Entonces su edad debería actualizarse a 21, si tiene 22 años. Si "Michael" no está en la matriz. Luego agregue Michael con una edad de 21 años.

Hay algunas cosas extrañas en tu código que no tienen sentido para mí. Por ejemplo, está buscando "Michael" en la matriz cada vez que se itera la matriz. Esto significaría que debes insertar un nombre "Michael" para cada entrada que no se llame "Michael". Eso no tiene sentido, ¿verdad?

Creo que esto es lo que quieres:

function addOrUpdateMichael(array) {
  const michael = array.find((x) => x.name == "Michael");
  if (!michael) {
      array.push({
          "name": "Michael",
          "age": 21,
          "gender": "male"
      });
  } else if (michael.age == 22) {
      michael.age = 21;
  }
  return array;
}

const testArray1 = [];
console.log(addOrUpdateMichael(testArray1));

const testArray2 = [{
    "name": "Michael",
    "age": 21,
    "gender": "male"
}, {
    "name": "Tony",
    "age": 18,
    "gender": "male"
}];
console.log(addOrUpdateMichael(testArray2));

const testArray3 = [{
    "name": "Michael",
    "age": 22,
    "gender": "male"
}, {
    "name": "Bob",
    "age": 36,
    "gender": "male"
}];
console.log(addOrUpdateMichael(testArray3));

3

Gracias amigo

-qqruza

19/03/2021 a las 20:21

1

¿Por qué utilizar findIndex en lugar de buscar?

-Barmar

19/03/2021 a las 20:23

@Barmar bueno, no hay diferenciar el resultado, pero estoy de acuerdo en que usar buscar hace que el código sea más legible. Se actualizó la respuesta. Felicitaciones.

– Krisztián Balla

19/03/2021 a las 20:28



------------------------------------

Aquí está mi solución rápida a este problema:

Desde mi punto de vista, es una buena idea abordar una nueva matriz para que contenga datos temporales.

La forma más sencilla de describir lo que quiero decir es la siguiente en el fragmento de código.

Fragmento de código (bucle For)
var originalsStack=[];


function PushToOriginalStack() {

for (i=0; i < originals.length; i++) {
    if (originals[i].name != "Samantha") {
        originalsStack.push({
            "name": "Michael",
            "age": 21,
            "gender": "male"
        });

    }
    else if (originals[i].name == "Samantha" && originals[i].age == 20) {
        originals[i].age = 21;
        originalsStack.push(originals[i]);
    }


    console.log(i);
}

originals = originalsStack;
}

PushToOriginalStack();

console.log(originals);

Importante que mantenga sus datos a mano para que pueda manejar la matriz original. ¡Espero poder ayudar un poco! ¡Salud!



------------------------------------

La solución simple se encuentra a continuación con la ayuda de increíbles seguidores en StackOverflow. Gracias a todos

const originals = [{
    "name": "Michael",
    "age": 21,
    "gender": "male"
}];
if (!originals || originals.length === 0) {
    originals.push({
        "name": "Michael",
        "age": 21,
        "gender": "male"
    });
} else {
    for (i = 0; i < originals.length; i++) {
        if (originals[i].name !== "Michaels") {
            originals.push({
                "name": "Michaels",
                "age": 22,
                "gender": "male"
            });
        }
        if (originals[i].name == "Michael" && originals[i].age == 21) {
            originals[i].age = 24;
        }
    }
}
console.log(originals);

7

Por favor, limpia tu sangría.

-Barmar

19/03/2021 a las 20:16

¿Cuál es la diferencia con el código original, además de establecer la edad en 24 en lugar de 22?

-Barmar

19/03/2021 a las 20:17

Si los originales no están configurados, originals.push() obtendrá un error.

-Barmar

19/03/2021 a las 20:17

1

Esto tiene el mismo problema que el código anterior. Agregará una nueva entrada de Michaels paratodas las entradas que no sean de Michaels.

-Barmar

19/03/2021 a las 20:19

1

¿El nombre que buscas es Michael o Michaels?

-Barmar

19/03/2021 a las 20:21

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare