Tengo que encontrar una propiedad en una matriz de objetos por valor, que es una lista de cadenas.
Por ejemplo, tengo algo como esto:
const colors ={ colors-1: [{color: 'blue'}], colors-2: [{color: 'gray'}, {color: 'red'}], colors-3: [{color: 'white'}] }
Y quiero obtener, por ejemplo, la propiedad colors-2
por cadena que está dentro del valor de la matriz.
Algo como esto:
findPropertyByValue(colors, 'red')
Y salida:
'colors-2'
¿Podría mostrarme cómo lograr esto? Gracias.
Así es como puedes lograr lo que quieres. Tenga en cuenta que agregué sus claves de objeto entre comillas, porque contienen -
, no funcionaría de otra manera.
const colors = { "colors-1": [{ color: "blue" }], "colors-2": [{ color: "gray" }, { color: "red" }], "colors-3": [{ color: "white" }] }; function findPropertyByValue(colors, value) { for (let color in colors) { if (colors[color].some((c) => c.color == value)) { return color; } } return ""; // if there isn't one } console.log(findPropertyByValue(colors, "red"));
Aquí hay una solución usando find
y some
.
Toma las entradas del objeto de colors
y encuentra la entrada que tiene un elemento con el color de entrada.
La búsqueda devuelve una entrada con [key,value]
por lo que para obtener la clave, tome el elemento 0
Aquí asumí que un solo color tiene una clave única.
añadió el ?.
antes de [0]
(encadenamiento opcional: acceso solo si está disponible) para que cuando se ingrese un color que no se encuentra, no haya errores (devuelve undefined
). ||
operador utilizado para devolver un mensaje como "no encontrado" si el paso de búsqueda devuelve undefined
const colors ={ 'colors-1': [{color: 'blue'}], 'colors-2': [{color: 'gray'}, {color: 'red'}], 'colors-3': [{color: 'white'}] } const findPropertyByValue = (obj,col) => Object.entries(obj).find(([k,v])=>v.some(({color}) => color===col))?.[0] || 'not found' console.log(findPropertyByValue(colors,'white')) console.log(findPropertyByValue(colors,'gray')) console.log(findPropertyByValue(colors,'red')) console.log(findPropertyByValue(colors,'blue')) console.log(findPropertyByValue(colors,'green'))
Puedes probar esto:
const colors = { "colors-1": [{ color: "blue" }], "colors-2": [{ color: "gray" }, { color: "red" }], "colors-3": [{ color: "white" }], }; function findPropertyByValue(obj, colorName) { return Object.entries(obj).find((entry) => entry[1].some((color) => color.color === colorName) )?.[0]; } console.log(findPropertyByValue(colors, "red")); console.log(findPropertyByValue(colors, "not in list"));
Y esta solución devolverá todos los campos con el color especificado:
const colors = { "colors-1": [{ color: "blue" }], "colors-2": [{ color: "gray" }, { color: "red" }], "colors-3": [{ color: "white" }], "colors-4": [{ color: "white" }, { color: "red" }], }; function findPropertyByValue(obj, colorName) { return Object.entries(obj).reduce( (acc, entry) => entry[1].some((color) => color.color === colorName) ? [...acc, entry[0]] : acc, [] ); } console.log(findPropertyByValue(colors, "red")); console.log(findPropertyByValue(colors, "not in list"));