Filtro de matriz de objetos utilizando matrices de valores?

votos
0

Dada la siguiente matriz de objetos:

var data = [
  {fruit: apples, stock: false, season: true},
  {fruit: peaches, stock: true, season: false},
  {fruit: oranges, stock: false, season: false},
  {fruit: pears, stock: false, season: true},
]

y estas dos matrices:

var fruits = [apples, peaches]
var inv = [stock]

¿Cómo puedo filtrar los objetos, desde data, por lo que los objetos se mantienen:

  • si tienen una fruiten la fruitsmatriz; Y
  • tienen una propiedad de la invmatriz que se establece en true

Así, en el ejemplo anterior, sólo sobreviven los melocotones:

  var result = [
    {fruit: peaches, stock: true, season: false}
  ]
Publicado el 19/09/2018 a las 17:03
fuente por usuario
En otros idiomas...                            


4 respuestas

votos
3

Creo que sólo puede usar el filtro con some()y includes():

var data = [
  {fruit: "apples", stock: false, season: true},
  {fruit: "peaches", stock: true, season: false},
  {fruit: "oranges", stock: false, season: false},
  {fruit: "pears", stock: false, season: true},
]

var fruits = ["apples", "peaches"]
var inv = ["stock"]

let filtered = data.filter(item => 
    fruits.includes(item.fruit) && inv.some(i => item[i]))

console.log(filtered)

Respondida el 19/09/2018 a las 17:07
fuente por usuario

votos
2

Se podría filtrar por buscar en la matriz de frutas con Array#includesy comprobar la propiedad mediante la iteración invcon Array#every.

var data = [ { fruit: "apples", stock: false, season: true }, { fruit: "peaches", stock: true, season: false }, { fruit: "oranges", stock: false, season: false }, { fruit: "pears", stock: false, season: true }],
    fruits = ["apples", "peaches"],
    inv = ["stock"],
    result = data.filter(o => fruits.includes(o.fruit) && inv.every(k => o[k]));
   
console.log(result);

Respondida el 19/09/2018 a las 17:07
fuente por usuario

votos
0
var output = data.filter(val => {
    if (fruits.includes(val.fruit)) {
        return inv.filter(prop => {
            if (val[prop] == true)
                return val
        }).length > 0
    }
})
console.log(output)

Creo que esto va a hacer, si lo que se quiere filtrar.

Respondida el 19/09/2018 a las 17:35
fuente por usuario

votos
0

Se puede utilizar combinación de filtro y todos los aquí.

var data = [
  {fruit: "apples", stock: false, season: true},
  {fruit: "peaches", stock: true, season: false},
  {fruit: "oranges", stock: false, season: false},
  {fruit: "pears", stock: false, season: true},
]

var fruits = ["apples", "peaches"]
var inv = ["stock"]

var result= data.filter(a=> fruits.some(b=> b == a.fruit) && inv.every(k => a[k]));
console.log(result)

Respondida el 19/09/2018 a las 17:11
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more