¿Qué estoy haciendo?
Así que estoy creando una matriz de objetos a partir de los datos que se encuentran en una hoja. Los datos de la hoja se ven así:
Name Lat Long test1 -3.4545 1.2568 test2 -5.4898 14.4589 test3 -3.4545 1.2568¿Qué quiero hacer?
Debo agregar un campo a cada objeto que diga si pertenecen al campus o no, y para hacer eso, debo verificar si el objeto tiene la misma latitud y longitud que otro objeto. Ejemplo de lo que quiero hacer:
[ { name: "test1", campus: "Yes" --> because the lat and long is the same in object test3, lat: -3.4545, long: 1.2568 }, { name: "test2", campus: "No", lat: -5.4898, long: 14.4589 }, { name: "test3", campus: "Yes" --> because the lat and long is the same object test1, lat: -3.4545, long: 1.2568 } ]¿Qué he hecho hasta ahora?
Estoy iterando sobre la hoja y creando los objetos:
let worksheets1 = {} for (const sheetName1 of workbook.SheetNames) { worksheets1[sheetName1] = XLSX.utils.sheet_to_json(workbook.Sheets['Sheet1'], { header: 1 }) } let data = worksheets1['Sheet1'] for (const rows of data) { if(rows[10] == "New"){ aux2.push({ name:rows[10], campus: "", //I need this lat: rows[35], long: rows[36], code: rows[7] !== undefined ? rows[7] : "No info", info:rows[17] !== undefined ? { data: rows[17].replace(/,\s/g, ",").split(","), source: "Sheet" } : "No info" }) } } aux2.shift()En resumen
Me pregunto si hay una manera de comparar sobre la marcha si dos o más objetos tienen la misma latitud y longitud, y si la tienen, ya lo agrego al campus de campo "Sí" o "No".
Gracias.
Ordene su matriz por las propiedades de lat / long de los objetos contenidos. Todos los objetos que tengan los mismos valores serán elementos de matriz adyacentes para que pueda asignar la bandera del campus en una sola pasada.
Código de muestra:
let orig = [ { name: "test1", lat: -3.4545, long: 1.2568 }, { name: "test2", lat: -5.4898, long: 14.4589 }, { name: "test3", lat: -3.4545, long: 1.2568 } ]; orig .sort ( (a,b) => { let c = (a.lat < b.lat) ? -1 : ((a.lat > b.lat) ? 1 : ((a.long < b.long) ? -1 : ((a.long > b.long) ? 1 : 0 )) ) ; return c; }); for (let i=1; i < orig.length; i++) { orig[i-1].campus = ((orig[i-1].lat === orig[i].lat) && (orig[i-1].long === orig[i].long)) ? 'Yes' : 'No'; } if (orig.length > 1) { orig[orig.length-1].campus = ((orig[orig.length-2].lat === orig[orig.length-1].lat) && (orig[orig.length-2].long === orig[orig.length-1].long)) ? 'Yes' : 'No'; } orig;La función de comparación personalizada se puede mejorar, por supuesto, para probar realmente si las coordenadas están dentro de algún parámetro de campus preespecificado. El valor de retorno específico si dos objetos difieren en ese aspecto no es importante siempre que devuelva 0 para todos los pares (y solo para esos pares) que se consideren 'iguales'.