Acabo de empezar a aprender javascript hoy y estoy tratando de verificar un objeto de matriz para verificar si la matriz NO contiene un objeto.
Para un ejemplo, estoy tratando de verificar si data2 no contiene data1 .
let data1 = [{ x: 6232, y: 10536, type: "data4", dead: 0, uid: 3832864 }]; let data2 = [ { x: 6352, y: 10656, type: "data1", dead: 0, uid: 3832861 }, { x: 6322, y: 10546, type: "data2", dead: 0, uid: 3832862 }, { x: 6542, y: 15356, type: "data3", dead: 0, uid: 3832863 } ]; let check = Object.entries(data2).find(([key, value]) => value.uid != data1[0].uid); console.log(check); // Expected output to be fales.Si alguien pudiera ayudarme o señalarme en la dirección correcta, realmente lo agradecería.
Debe comparar ( === ) el resultado de find con !undefined .
Editar: no necesita llamar a las entries en una matriz.
const data1 = [{ x: 6232, y: 10536, type: "data4", dead: 0, uid: 3832864 }]; const data2 = [ { x: 6352, y: 10656, type: "data1", dead: 0, uid: 3832861 }, { x: 6322, y: 10546, type: "data2", dead: 0, uid: 3832862 }, { x: 6542, y: 15356, type: "data3", dead: 0, uid: 3832863 } ]; const check = data2.find(value => value.uid === data1[0].uid) !== undefined; console.log(check); // false Como otros han notado, puede hacer un cortocircuito con some . Aquí hay una versión optimizada:
/** * Detrmines if an object exists within an array of object * @param {Object[]} arr - An array of object to search * @param {Object} obj - An object to search for * @param {Function} fn - A pluck function used for comparing * @return {Boolean} Returns true if the item exists */ const contains = (arr, obj, fn) => (res => arr.some(e => fn(e) === res)) // Compare (fn(obj)); // Pre-calculate as `res` const data1 = [{ x: 6232, y: 10536, type: "data4", dead: 0, uid: 3832864 }]; const data2 = [ { x: 6352, y: 10656, type: "data1", dead: 0, uid: 3832861 }, { x: 6322, y: 10546, type: "data2", dead: 0, uid: 3832862 }, { x: 6542, y: 15356, type: "data3", dead: 0, uid: 3832863 } ]; const [obj] = data1; // Destructure first item console.log(contains(data2, obj, ({ uid }) => uid)); // false console.log(contains(data2, { uid: 3832862 }, ({ uid }) => uid)); // trueLa forma en que aborda este problema está bien, y la otra respuesta lo ayudará a solucionarlo. Pero se supone que esto se resuelve idealmente como una matriz. Con Object.entries() está obteniendo los objetos de la matriz y los índices como valores y claves, respectivamente. Luego iteras sobre ellos.
Puede notar que ni siquiera está usando la variable clave.
No es necesario hacer todo esto ya que ya tiene una matriz .
Puede usar .some() , que devuelve verdadero/falso en función de una condición que cumple incluso uno de los elementos de la matriz. Exactamente lo que necesitas.
let data1 = [{ x: 6232, y: 10536, type: "data4", dead: 0, uid: 3832864 }]; let data2 = [ { x: 6352, y: 10656, type: "data1", dead: 0, uid: 3832861 }, { x: 6322, y: 10546, type: "data2", dead: 0, uid: 3832862 }, { x: 6542, y: 15356, type: "data3", dead: 0, uid: 3832863 } ]; let check = data2.some(x => x.uid === data1[0].uid); console.log(check); // Expected output to be fales.Tiene algunos errores de sintaxis en su código anterior. data2 es una matriz de objetos, por lo que no necesita hacer Object.entries() para obtener los elementos de la matriz. Usaría el método Array.some() aquí para que devuelva un valor booleano en lugar del elemento de datos real si espera tener un valor verdadero o falso registrado. el método Array.some() solo regresa una vez que un caso es verdadero y no tenemos que revisar todas las entradas en la matriz de objetos si ya encontramos una coincidencia.
let data1 = [{ x: 6232, y: 10536, type: "data4", dead: 0, uid: 3832864 }]; let data2 = [ { x: 6352, y: 10656, type: "data1", dead: 0, uid: 3832861 }, { x: 6322, y: 10546, type: "data2", dead: 0, uid: 3832862 }, { x: 6542, y: 15356, type: "data3", dead: 0, uid: 3832863 }, { x: 6232, y: 10536, type: "data4", dead: 0, uid: 3832864 } ]; let check = data2.some(entry => entry.uid == data1[0].uid); console.log(check); // Expected output to be true.Si no tuviera una identificación única para cada entrada, una forma rápida y sucia de hacerlo sería clasificar ambos objetos y luego comparar las cadenas. Esto tiene sus limitaciones porque el orden de los campos en su objeto debe ser el mismo.
var object = { 'a': 1, 'b':2}; var other = { 'a': 1, 'b':2 }; console.log(JSON.stringify(object) == JSON.stringify(other)); //this will print truePara una comparación profunda de objetos, me gusta usar el método isequal de lodash
var object = { 'a': 1, 'b':2}; var other = { 'b':2, 'a': 1 }; console.log(JSON.stringify(object) == JSON.stringify(other)); //this will print false console.log(_.isEqual(object, other)); //this will print true