Tengo una serie de objetos llamados articles . Un artículo tiene 3 propiedades importantes. name , clicks y variants . La propiedad variants también es una matriz de objetos que contienen name (corresponde a un artículo en la matriz articles ). ¿Cuál es la forma más eficaz de encontrar la variante con más clics de cada artículo?
Pensé que tal vez había alguna forma de usar un mapa o un operador de propagación, pero no entiendo la sintaxis. Creo que podría crear un 'diccionario' con el artículo con más clics para cada conjunto, pero ¿hay alguna manera más fácil?
Aporte:
[ {name: "article1", clicks: 10, variants: ["article2", "article3"]}, {name: "article2", clicks: 7, variants: ["article1", "article3"]}, {name: "article3", clicks: 15, variants: ["article1", "article2"]}, {name: "article4", clicks: 3, variants: ["article5"]}, {name: "article5", clicks: 6, variants: ["article4"]}, ]Salida deseada:
{name: "article1", clicks: 10, variants: ["article2", "article3"], mostClickedVariant: "article3"} {name: "article2", clicks: 7, variants: ["article1", "article3"], mostClickedVariant: "article3"},etc. para cada artículo
Pruebe esto (agregué todos los comentarios descriptivos en el fragmento de código a continuación) :
// Input array const arr = [ {name: "article1", clicks: 10, variants: ["article2", "article3"]}, {name: "article2", clicks: 7, variants: ["article1", "article3"]}, {name: "article3", clicks: 15, variants: ["article1", "article2"]}, {name: "article4", clicks: 3, variants: ["article5"]}, {name: "article5", clicks: 6, variants: ["article4"]}, ]; // Iterating over an input array. const res = arr.map(obj => { // Fetching variant objects in an array based on the variants name we have in the array. const variantArr = obj.variants.map(variant => arr.find(o => o.name === variant)); // Getting most clicked variant object by sorting the variantArr in desc order based on the clicks. const mostClickedVariant = variantArr.sort((a, b) => b.clicks - a.clicks)[0]; // creating a new property 'mostClickedVariant' in each obejct and assigning the name of the most clicked variant. obj.mostClickedVariant = mostClickedVariant.name; return obj; }); // Expected output console.log(res);¡Bienvenido a StackOverflow! Realice el recorrido , visite el centro de ayuda e infórmese sobre cómo hacer buenas preguntas . Después de investigar un poco y buscar temas relacionados con SO, pruébelo usted mismo. Si está atascado, publique un ejemplo mínimo reproducible de su intento y anote exactamente dónde está atascado. La gente estará encantada de ayudar.
Debido a que alguien ya ha publicado una respuesta funcional, no reprimiré mi enfoque, que es bastante diferente de ese. Por lo general, lo haría hasta que el autor de la pregunta muestre más esfuerzo.
Esta versión no muta el original, solo devuelve una copia con las nuevas propiedades agregadas. También utiliza una forma más eficiente de encontrar máximos, reduciendo la lista a su máximo en tiempo O (n) , en lugar de usar una sort O (n log n) .
const maxBy = (fn) => (xs) => xs .reduce ( ({m, mx}, x, _, __, v = fn (x)) => v > m ? {m: v, mx: x} : {m, mx}, {m: -Infinity} ) .mx const addMostClicked = ( articles, index = new Map (articles .map (({name, clicks}) => [name, clicks])), findMax = maxBy((x) => index .get (x)) ) => articles .map ( (article) => ({... article, mostClickedVariant: findMax (article .variants)}) ) const articles = [{name: "article1", clicks: 10, variants: ["article2", "article3"]}, {name: "article2", clicks: 7, variants: ["article1", "article3"]}, {name: "article3", clicks: 15, variants: ["article1", "article2"]}, {name: "article4", clicks: 3, variants: ["article5"]}, {name: "article5", clicks: 6, variants: ["article4"]}] console .log (addMostClicked (articles)) .as-console-wrapper {max-height: 100% !important; top: 0} Primero creamos un índice que asigna los nombres de los artículos a sus recuentos de clics y, utilizando el asistente maxBy , creamos una función, findMax , que encontrará el nombre asociado con el mayor recuento de clics.
Luego, simplemente asignamos los elementos y devolvemos copias con las nuevas propiedades mostClickedVariant determinadas llamando a findMax con la lista de nombres de variantes.