Dado un número n de colecciones/matrices, me gustaría identificar elementos comunes y a qué colecciones son comunes.
Esto es un poco similar a esta pregunta , sin embargo, podría haber elementos similares en, por ejemplo, colletion1 y collection3, o incluso en todos ellos. No solo busco elementos similares en todas las colecciones. Además, estoy abierto a usar cualquier biblioteca de Node.js.
var arr["One"] = arrProps[{name: '1', prop2: 'aaa'}], arrValues['apple', 'orange', 'banana', 'pear', 'fish', 'pancake', 'taco', 'pizza']; var arr["Two"] = arrProps[{name: '2', prop2: 'bbb'}], arrValues['taco', 'fish', 'apple', 'pizza', 'car']; var arr["Three"] = arrProps[{name: '3', prop2: 'ccc'}], arrValues['banana', 'pizza', 'fish', 'apple', 'orange', ]; var arr["Four"] = arrProps[{name: '4', prop2: 'ddd'}], arrValues['grape', 'pear', 'chicken', 'car', 'orange'];El resultado debe ser:
[arrValue, arrProps.name] apple: 1,2,3 banana: 1,3 pear: 1,4 fish: 1,2,3 taco: 1,2 pizza: 1,3 car: 2,4 orange: 3,4En lugar de usar matrices, si esto se representara como un gráfico JSON, ¿sería más fácil de resolver y, de ser así, cómo?
Gracias a @FFire por abordar esto.
Modifiqué el código para poder acceder a las propiedades del objeto y mostrar el resultado en varias tablas para mayor visibilidad.
const arr = [ { arrProps: [{name: '1', prop2: 'aaa'}], arrValues: ['apple', 'orange', 'banana', 'pear', 'fish', 'pancake', 'taco', 'pizza'] }, { arrProps: [{name: '2', prop2: 'bbb'}], arrValues: ['taco', 'fish', 'apple', 'pizza', 'car'] }, { arrProps: [{ name: '3', prop2: 'ccc' }], arrValues: ['banana', 'pizza', 'fish', 'apple', 'orange'] }, { arrProps: [{ name: '4', prop2: 'ddd' }], arrValues: ['grape', 'pear', 'chicken', 'car', 'orange'] }, { arrProps: [{ name: '5', prop2: 'ddeeed' }], arrValues: ['blade', 'movie', 'apple', 'banana', 'lake'] } ]; const result = arr .flatMap(({ arrValues }) => arrValues ) // all values .filter((value, index, coll) => coll.indexOf(value) === index) //unique values .reduce((acc, value) => { const parentProp = arr // name, prop2, arrValues .filter((obj) => obj.arrValues.includes(value)) .map((obj) => obj.arrProps[0]); //acc[value] = (acc[value] ? [...acc[value], parentProp] : [parentProp]) //.join(','); acc[value] = parentProp return acc; }, {}) console.log(result); Object.entries(result).forEach(([k, v]) => { //console.log("The pair: ", k) ////console.log("The value: ", v) //v.forEach(_parent => console.log(` // Name: ${_parent.name} // Prop: {_parent.prop2} //`)); console.log(` ----] The value '${k}' exists in:`); console.table(v); }) console.table(result); //result["apple"].forEach(e => console.log(e.name)); console.log(JSON.stringify(result));Por supuesto, como todas las soluciones, puede haber una forma más eficiente de hacerlo. Más respuestas bienvenidas.
Tipo de solución ' tonta ':
const arr = [ { arrProps: [{name: '1', prop2: 'aaa'}], arrValues: ['apple', 'orange', 'banana', 'pear', 'fish', 'pancake', 'taco', 'pizza'] }, { arrProps: [{name: '2', prop2: 'bbb'}], arrValues: ['taco', 'fish', 'apple', 'pizza', 'car'] }, { arrProps: [{name: '3', prop2: 'ccc'}], arrValues: ['banana', 'pizza', 'fish', 'apple', 'orange' ] }, { arrProps: [{name: '4', prop2: 'ddd'}], arrValues: ['grape', 'pear', 'chicken', 'car', 'orange'] } ]; const result = arr .flatMap(({ arrValues }) => arrValues ) // all values .filter((value, index, coll) => coll.indexOf(value) === index) //unique values .reduce((acc, value) => { const propName = arr .filter((obj) => obj.arrValues.includes(value)) .map((obj) => obj.arrProps[0].name); acc[value] = (acc[value] ? [...acc[value], propName] : [propName]) .join(','); return acc; }, {}) console.log(result) .as-console-wrapper { max-height: 100% !important; top: 0; }actualizar
Reconsideré mi enfoque de la solución y me di cuenta de que estaba fundamentalmente equivocado.
solución actualizada:
const arr = [ { arrProps: [{name: '1', prop2: 'aaa'}], arrValues: ['apple', 'orange', 'banana', 'pear', 'fish', 'pancake', 'taco', 'pizza'] }, { arrProps: [{name: '2', prop2: 'bbb'}], arrValues: ['taco', 'fish', 'apple', 'pizza', 'car'] }, { arrProps: [{name: '3', prop2: 'ccc'}], arrValues: ['banana', 'pizza', 'fish', 'apple', 'orange' ] }, { arrProps: [{name: '4', prop2: 'ddd'}], arrValues: ['grape', 'pear', 'chicken', 'car', 'orange'] } ]; const result = arr.reduce((acc, { arrProps: [{ name }], arrValues }) => { arrValues.forEach((value) => { acc[value] = acc[value] ? `${acc[value]},${name}`: name; }); return acc; }, {}); console.log(result) .as-console-wrapper { max-height: 100% !important; top: 0; }