Tengo una matriz que se ve así:
const subscriptions = [ { "price": "20", "product": "apple", "quantity": 1, }, { "price": "10", "product": "orange", "quantity": 1, }, { "price": "10", "product": "orange", "quantity": 1, }, { "price": "10", "product": "orange", "quantity": 1, }, ] Y quiero extraer todos los elementos de la matriz con un "producto" de apple , banana o pear .
Así que estoy usando filter() así:
const currentPlans = subscriptions.filter( (subscription) => subscription.product === ('apple' || 'banana' || 'pear') ); Dado que la matriz solo tiene una instancia de apple , debería ser lo que contiene currentPlans .
Pero currentPlans está devolviendo una matriz vacía.
¿Qué estoy haciendo mal?
La siguiente línea no va a funcionar como esperas. El lado derecho evalúa primero un valor ( apple ) y luego verifica la igualdad. Nunca busca banana o pear .
subscription.product === ("apple" || "banana" || "pear")Debe usar otra matriz para mantener las coincidencias. Prueba como a continuación.
const subscriptions = [ { price: "20", product: "apple", quantity: 1, }, { price: "10", product: "orange", quantity: 1, }, { price: "10", product: "orange", quantity: 1, }, { price: "10", product: "orange", quantity: 1, }, ]; const matches = ["apple", "banana", "pear"]; const currentPlans = subscriptions.filter( (subscription) => matches.indexOf(subscription.product) >= 0 ); console.log(currentPlans); const subscriptions = [ { price: "20", product: "apple", quantity: 1, }, { price: "10", product: "orange", quantity: 1, }, { price: "10", product: "orange", quantity: 1, }, { price: "10", product: "orange", quantity: 1, }, ]; const matches = ["apple", "banana", "pear"]; const currentPlans = subscriptions.filter( (subscription) => matches.includes(subscription.product) ); console.log(currentPlans);Cuando usa verificaciones condicionales con respecto a la verificación de igualdad, según el nivel de precedencia, la expresión que está presente en el lado derecho de la verificación de igualdad se evalúa primero, por lo que cuando hace 'apple'||'banana'||'pear' , esta afirmación por sí sola se evaluó y luego se comparó con la expresión del lado izquierdo.
Por lo tanto 'apple'||'banana'||'pear' se evaluaría como veraz con el valor apple y cuando verifique este valor con la subscription.product la matriz de filtro devolverá efectivamente un objeto donde el valor de la propiedad product es apple .
const subscriptions = [ { "price": "20", "product": "apple", "quantity": 1, }, { "price": "10", "product": "orange", "quantity": 1, }, { "price": "10", "product": "orange", "quantity": 1, }, { "price": "10", "product": "orange", "quantity": 1, }, ] const currentPlans = subscriptions.filter( (subscription) => subscription.product === ('apple' || 'banana' || 'pear') ); console.log(currentPlans) Aunque esto funcionaría al filtrar objetos cuyo valor de producto es apple , la lógica es técnicamente incorrecta cuando desea filtrar valores basados en comprobaciones condicionales. Como se mencionó anteriormente, el OR condicional siempre devolvería el primer valor, es decir, apple , y compararía este valor con cada valor iterable. Para que esto funcione realmente con comprobaciones condicionales, tendría que comprobar individualmente el valor con todos los demás valores, así:
const currentPlans = subscriptions.filter( (subscription) => subscription.product === 'apple' || subscription.product === 'banana' || subscription.product === 'pear' ); O bien, una forma más fácil de lograr lo mismo sería aplastar todos los valores en una matriz y llamar al método includes y pasar el valor iterable actual como argumento.
const currentPlans = subscriptions.filter( (subscription) => ['apple' || 'banana' || 'pear'].includes(subscription.product) );