Gunjan Anshul
Gunjan Anshul

Reputation: 103

How to process & calculate - two array objects without For Loop

I have two objects and I want to process them without use of for Loop and get the result.

key is taken from obj1 "keyname"

const obj1 = [{
    _id: 5 f467650890a7444d8d9ea5b,
    keyname: 'fTime',
    PTag: '(FaultHrs*360)+(FaultMins*60)+FaultSecs',
    __v: 0
  },
  {
    _id: 5 f467650890a7444d8d9ea5b,
    keyname: 'rTime',
    PTag: '(RunHrs*360)+(RunMins*60)+RunSecs',
    __v: 0
  }
]
const obj2 = {
  FaultHrs: 2,
  FaultMins: 0,
  FaultSecs: 49,
  RunHrs: 1,
  RunMins: 0,
  RunSecs: 0,

}

Result: {
  fTime: 769,
  rTime: 360
} 

Upvotes: 0

Views: 68

Answers (1)

Abhilash
Abhilash

Reputation: 2256

Note: This uses eval function which can be dangerous. Use it only when you're sure PTag is a safe expression.

const obj1 = [{ _id: '5 f467650890a7444d8d9ea5b', keyname: 'fTime', 
  PTag: '(FaultHrs*360)+(FaultMins*60)+FaultSecs',    __v: 0 },
  { _id: '5 f467650890a7444d8d9ea5b', keyname: 'rTime',
  PTag: '(RunHrs*360)+(RunMins*60)+RunSecs', __v: 0 }
]
const obj2 = { FaultHrs: 2, FaultMins: 0, FaultSecs: 49, RunHrs: 1, RunMins: 0, RunSecs: 0,}

const res = obj1.reduce((res, k) => {
  // find out parameters in formula
  const matches = k.PTag.match(/[a-zA-Z]+/g);

  // substitute them with numbers
  const newTag = matches.reduce((tag, m) => tag.replace(m, obj2[m] || 0), k.PTag);

  // calculate result
  res[k.keyname] = eval(newTag);

  return res;
}, {});

console.log(res)

Output:

{fTime: 769, rTime: 360}

Upvotes: 1

Related Questions