Pido disculpas por el título. No estoy muy seguro de cómo expresarlo mejor, ya que todavía estoy aprendiendo Javascript.
Tengo un objeto de fechas que tiene una ocurrencia de valores dinámicos de la siguiente manera: (Clave = fecha, valor = número)
2021-12-23: 4 2021-12-24: 7 2021-12-27: 6 2022-01-05: 5 ... etcTambién tengo otro objeto que se parece a esto:
2022-01-05: 5Básicamente, necesito que el segundo objeto complete 0 para todas las claves que no coincidan. Por ejemplo, el segundo objeto debería verse de la siguiente manera (donde el valor de la coincidencia no importa):
2021-12-23: 0 2021-12-24: 0 202-12-27: 0 2022-01-05: 5Estoy realmente perplejo con este, cualquier ayuda de javascript sería inmensamente apreciada.
Aquí hay una implementación que usa Object.entries y Array.prototype.reduce , pero en realidad hay muchas formas de abordar esto.
const original = { "2021-12-23": 4, "2021-12-24": 7, "2021-12-27": 6, "2022-01-05": 5 } function filterObjectByKey( o, key ){ return Object.entries(o).reduce((acc, [k,v])=>{ acc[k] = ( k === key ) ? v : 0; return acc; }, {}); } const filtered = filterObjectByKey( original, "2022-01-05"); console.log( filtered );Actualizado: la función también puede aceptar el objeto secundario como argumento y filtrar según sus claves:
const original = { "2021-12-23": 4, "2021-12-24": 7, "2021-12-27": 6, "2022-01-05": 5 } const secondary = { "2022-01-05": 5 } function filterObjectByKey( o, sec ){ const keys = Object.keys(sec); return Object.entries(o).reduce((acc, [k,v])=>{ acc[k] = keys.includes(k) ? v : 0; return acc; }, {}); } const filtered = filterObjectByKey( original, secondary ); console.log( filtered );Tal vez podría usar alguna forma de iteración con el operador de fusión (||)...
someObjArray.forEach(function(x) { return { // if the obj does not have key/value pair for that date, it will use 0 (the value to the right of ||) 2021-12-23: (x['2021-12-23'] || 0), 2021-12-24: (x['2021-12-24'] || 0), 2021-12-27: (x['2021-12-27'] || 0), 2022-01-05: (x['2021-01-05'] || 0) } });De acuerdo, lo que desea hacer para lograr esto es recorrer todas las claves del primer objeto (el que tiene varias claves de cadena de fecha/valores numéricos) y establecer el nuevo valor numérico en 0 si esa clave no está incluida en el segundo objeto.
De su descripción:
const firstObject = { 2021-12-23: 4, 2021-12-24: 7, 2021-12-27: 6, 2022-01-05: 5 } const secondObject = { 2022-01-05: 5 } parece que el código aquí se beneficiaría de Object.entries que es una función que puede ejecutar en un objeto Object.entries(myObject || {}) y devolverá una matriz bidimensional de [[key, val], [key, val]] del objeto [[key, val], [key, val]] .
Entonces su código final se verá así:
const mapTo0s = (firstObject, secondObject) => { return Object.fromEntries(Object.entries(firstObject).map(([dateString, value]) => { if (!secondObject[dateString]) { return [dateString, 0]; } return [dateString, value]; // assumes you want to keep the value as is when the secondObject has the value. })) }; Object.fromEntries es otro método de javascript que convierte una matriz bidimensional de matrices en un objeto con las claves correspondientes. Entonces, si envía [['05-10-2021', 3]] , devolverá {'05-10-2021': 3 } .
Puede ejecutar esa función de esta manera:
const result = mapTo0s(firstObject, secondObject) // should result in: console.log({ result }) /* { result: { 2021-12-23: 0, 2021-12-24: 0, 202-12-27: 0, 2022-01-05: 5 } } */