Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

197
Views
Javascript reduce () en una matriz de objetos, con entradas que son variables simples y una matriz también

Estoy tratando de usar la función de reducción para iterar a través de una matriz de objetos y obtener un resultado que resuma los datos que se muestran dentro de la matriz de objetos (de hecho, una especie de eliminador de duplicados).

Sobre datos como:

 mainData = [ {data : {name: "item1", color: "red", type: ["metal", "wood"]}, id: 1}, {data : {name: "item2", color: "green", type: ["wood"]}, id: 2}, {data : {name: "item3", color: "green", type: ["wood", "stone", "marble"]}, id: 3}, {data : {name: "item4", color: "red", type: ["stone"]}, id: 4} ]

al usar la función:

 const getValues = (data, key) => { return data.reduce((acc, item) => { if(acc.indexOf(item.data[key]) > -1) { return [...acc] } else { return [...acc, item.data[key]] } }, [data[0].data[key]]) //initial value }

Se bifurcará bien si llamo a esta función getValues getValues(mainData, "color") para la clave de color , dando el siguiente resultado: ["red", "green"] , que se espera.

Pero si llamo a la función con getValues(mainData, "type") , esta función ignorará la mayoría de los valores del tipo de matriz valor del type de clave.

Traté de resolverlo usando un bucle for limitado por data["type"].length justo antes de la condición if...else de la función de reducción, así:

 const getValues = (data, key) => { return data.reduce((acc, item) => { for(let i = 0; i < item.data[key].length; i++) { if(acc.indexOf(item.data[key][i]) > -1) { return [...acc] } else { return [...acc, item.data[key][i]] } } }, [data[0].data[key][0]]) }

Pero tampoco funciona.

Alguien tiene una idea de como solucionar esto?

about 4 years ago · Juan Pablo Isaza
3 answers
Answer question

0

puedes usar flatMap para eso

como esto

 const mainData = [ {data : {name: "item1", color: "red", type: ["metal", "wood"]}, id: 1}, {data : {name: "item2", color: "green", type: ["wood"]}, id: 2}, {data : {name: "item3", color: "green", type: ["wood", "stone", "marble"]}, id: 3}, {data : {name: "item4", color: "red", type: ["stone"]}, id: 4} ] const getValue = (data, key) => [...new Set(data.flatMap(({data}) => Array.isArray(data[key])?data[key]: [data[key]]))] console.log(getValue(mainData, 'name')) console.log(getValue(mainData, 'type'))

about 4 years ago · Juan Pablo Isaza Report

0

Tal vez sea más fácil usar un Conjunto para deduplicar los valores.

 const mainData=[{data:{name:"item1",color:"red",type:["metal","wood"]},id:1},{data:{name:"item2",color:"green",type:["wood"]},id:2},{data:{name:"item3",color:"green",type:["wood","stone","marble"]},id:3},{data:{name:"item4",color:"red",type:["stone"]},id:4}]; // Pass in the data, and the prop you want to look at function finder(arr, prop) { // Create a new set const set = new Set(); // Iterate over the array of objects for (const obj of arr) { const value = obj.data[prop]; // If `value` is an array add each value to the set if (Array.isArray(value)) { value.forEach(v => set.add(v)); } else { // Otherwise just add the value set.add(obj.data[prop]); } } // Return an array from the set return [...set]; } console.log(finder(mainData, 'color')); console.log(finder(mainData, 'type')); console.log(finder(mainData, 'name'));

about 4 years ago · Juan Pablo Isaza Report

0

  • .flatMap() la primera capa que busca keyA ("datos"). Cada objeto data:{...} se convierte en una matriz de pares:

     [["name","item1"],["color","red"],["type",["metal","wood"]],...];
  • Otro .flatMap() itera a través de la matriz de pares y devuelve un valor cuando coincide con keyB . Todo lo demás se devuelve como una matriz vacía que no dará como resultado nada, ya que .flatMap() aplana sus devoluciones.

     ([k, v]) => k === keyB ? v :[])
  • Finalmente, el retorno de ambos flatMap() se convierte en un Set() y luego el Set se devuelve como una matriz sin duplicados.

     return [...new Set(output)]; 

 const mainData = [ {data : {name: "item1", color: "red", type: ["metal", "wood"]}, id: 1}, {data : {name: "item2", color: "green", type: ["wood"]}, id: 2}, {data : {name: "item3", color: "green", type: ["wood", "stone", "marble"]}, id: 3}, {data : {name: "item4", color: "red", type: ["stone"]}, id: 4} ]; function compact(objArray, keyA, keyB) { const output = objArray.flatMap( obj => Object.entries(obj[keyA]).flatMap( ([k, v]) => k === keyB ? v :[] ) ); return [...new Set(output)]; } console.log(compact(mainData, 'data', 'type')); console.log(compact(mainData, 'data', 'color')); console.log(compact(mainData, 'data', 'name'));

about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!