Estoy tratando de comparar una matriz de elementos con los elementos de una matriz 2D. Si se encuentra una coincidencia, aumentará el recuento de esa fila de elementos 2D. Logré hacerlo con la primera fila de la matriz 2D, sin embargo, no sé cómo hacer que el código siga buscando la siguiente fila de la matriz 2D.
var fruits=[ ['apple', 'banana', 'mango'], ['grape', 'pineapple', 'blueberry'], ['strawberry', 'mangosteen'] ]; var fruit_i_like=[ ['grape', 'banana', 'pineapple'] ]; //if found match from the first row of fruits, increment this var var fruit1_count = 0; //if found match from the second row of fruits, increment this var var fruit2_count = 0; //if found match from the third row of fruits, increment this var var fruit3_count = 0; for (var i = 0; i < fruit_i_like.length; i++) { for (var j = 0; j < fruits.length; j++){ if (fruits[j].indexOf(fruit_i_like[i]) > -1) { fruit1_count++; } } }El resultado esperado debería ser imprimir el número de coincidencias que tiene la matriz fruit_i_like con cada fila de la matriz fruit. Por ejemplo, aquí fruit1_count sería 1, fruit2_count sería 2, fruit3_count sería 0.
¿Hay alguna forma de verificar las otras filas usando JS puro? ¡Gracias!
Probablemente sea mejor usar una matriz que variables en este caso, para que no tenga que codificar nombres y definiciones. En este caso, obtendrá una lista ordenada del recuento de cada fruta al final de la matriz, en el orden en que las colocó inicialmente en la matriz de fruits (tampoco estoy seguro de por qué fruit_i_like es bidimensional).
var fruits = [ ['apple', 'banana', 'mango'], ['grape', 'pineapple', 'blueberry'], ['strawberry', 'mangosteen'] ]; var fruit_i_like = [ ['grape', 'banana', 'pineapple'] ]; let fruitCounts = []; fruits.forEach((fruitsList, i) => { fruitCounts.push(0); fruit_i_like[0].forEach(likedFruit => { if (fruitsList.includes(likedFruit)) { fruitCounts[i]++; } }); }); fruitCounts.forEach((count, i) => { console.log(`Fruit count ${i} = ${count}`); });1) Puede lograr fácilmente el resultado usando Set y simple for loop. Primero puede crear un objeto de propiedades en el que desea contar como:
const obj = { fruit1_count: 0, fruit2_count: 0, fruit3_count: 0, }; var fruits = [ ["apple", "banana", "mango"], ["grape", "pineapple", "blueberry"], ["strawberry", "mangosteen"], ]; var fruit_i_like = [["grape", "banana", "pineapple"]]; const obj = { fruit1_count: 0, fruit2_count: 0, fruit3_count: 0, }; const set = new Set(fruit_i_like[0]); for (let i = 0; i < fruits.length; ++i) { const arr = fruits[i]; for (let j = 0; j < arr.length; ++j) { if (set.has(arr[j])) obj[`fruit${i + 1}_count`]++; } } const { fruit1_count, fruit2_count, fruit3_count } = obj; console.log(fruit1_count); console.log(fruit2_count); console.log(fruit3_count); 2) También puede usar reduce y forEach aquí como:
var fruits = [ ["apple", "banana", "mango"], ["grape", "pineapple", "blueberry"], ["strawberry", "mangosteen"], ]; var fruit_i_like = [["grape", "banana", "pineapple"]]; const obj = { fruit1_count: 0, fruit2_count: 0, fruit3_count: 0, }; const set = new Set(fruit_i_like[0]); const resultObj = fruits.reduce((acc, curr, i) => { curr.forEach((o) => { if (set.has(o)) acc[`fruit${i + 1}_count`]++; }); return acc; }, obj); const { fruit1_count, fruit2_count, fruit3_count } = resultObj; console.log(fruit1_count); console.log(fruit2_count); console.log(fruit3_count);Llegué un poco tarde a la fiesta, pero también puede hacer esto con un par de métodos Array.reduce( Array.reduce() anidados y usando Array.includes() en la reducción anidada para incrementar el conteo si está incluido en la matriz.
const fruits = [ ['apple', 'banana', 'mango'], ['grape', 'pineapple', 'blueberry'], ['strawberry', 'mangosteen'] ]; const fruit_i_like = [ ['grape', 'banana', 'pineapple'] ]; const [fruit1_count, fruit2_count, fruit3_count] = fruits.reduce((a, c, i) => { a[i] = fruit_i_like[0].reduce((aa, cc) => aa + c.includes(cc), 0); return a; }, new Array(fruits.length)); console.log({ fruit1_count: fruit1_count, fruit2_count: fruit2_count, fruit3_count: fruit3_count })