OFMN21
OFMN21

Reputation: 23

i couldn't figure out how can i make the object dynamically

as you can see i get the "p" array from a html form, and i want to make a dynamic object from the "p" array here

function filter(p){
var  obj;
console.log(p);//[ 'Grade', '>','123']

if(p[1]== ">"){p[1]=gt}
      obj = {
        $and:[
          {p[0]: {$p[1]: p[3}}
        ]
    }

return obj;
} 

to pass it to this aggregation function:

    async function query(DS,filter,q1,q2,q3){

arr.length = 0;
var obj;
var x = [];
var y = [];
var filtered;
const projection = { _id: 0 }; projection[q1] = 1; projection[q2] = 1;
const grouping ={}; grouping[q1]=q1; grouping[q2] = q2;

        filtered = await DS.aggregate([
                                      {$project: projection},
                                      {$match: filter}
                                      ]).toArray()
}
if(q3 == ""){
  for (let i = 0; i < filtered.length; i++) {
  obj = filtered[i]
  x.push(obj[q1])
  y.push(obj[q2])
}
arr.push(x)
arr.push(y)
return arr;
}

i couldn't figure out how can i make the object dynamically.

Upvotes: 0

Views: 33

Answers (1)

chill389cc
chill389cc

Reputation: 432

If you want to generate the objects keys dynamically, you can compute them by using square brackets where the key(s) would go.

For your case, you can replace this:

if(p[1]== ">"){p[1]=gt}
      obj = {
        $and:[
          {p[0]: {$p[1]: p[3}}
        ]
    }

with this:

  if (p[1] === ">") { p[1] = 'gt' }
  obj = {
    $and:[
      {
        [p[0]]: {
          ['$' + p[1]]: p[2]
        }
      }
    ]
  }

and you will get this object as a result (when using your provided input):

{"$and": [
    {
      "Grade": {
        "$gt": "123"
      }
    }
  ]
}

Hope that helps!

Upvotes: 1

Related Questions