Ad

Get The Object Value Based On Input Objects In Javascript

- 1 answer

I would like to how to get the value based on input objects in javascript. If the source matches the currency and also matches the type in paymentin and paymentout in object then get the value of speed and fees

for example 'SGD' with type_in 'credit' and type_out 'bank' should return the speed and fee

Expected Output:

id: transfer  credit: 1 days 1% pay_in: pay_out: bank
id: insta debit: 1 days 1.5% pay_in: pay_out: bank

I tried but i got stuck

function getValue(source,typein,typeout,obj){
  var filterArr = source.filter(function(value){
    return value.country_from.filter(function(payin){
      const in= payin.paymentIn.filter(function(ty){
        return ty.type == typein
     })
      const out = payin.paymentIn.filter(function(ty){
        return ty.type == typeout
     })
   })
 })
}
var result  = getValue(source,type_in,type_out,obj);
//input objects
var source="SGD";
var type_in="credit";
var type_out="bank";
var obj = [{
    "id": "transfer",
    "country_from": [{
        "currency": [
            "SGD",
            "USD"
        ],
        "paymentIn": [{
            "type": "credit",
            "speed": {
                "unit": "days",
                "number": "1"
            },
            "fee": {
                "type": "%",
                "number": "1"
            }
        }],
        "paymentOut": [{
            "type": "bank",
            "speed": {
                "unit": "days",
                "number": "2"
            }
       }]
    }]
}, {
    "id": "insta",
    "country_from": [{
        "currency": [
            "SGD",
            "USD"
        ],
        "paymentIn": [{
            "type": "credit",
            "speed": {
                "unit": "days",
                "number": "1"
            },
            "fee": {
                "type": "%",
                "number": "1.5"
            }
        }],
       "paymentOut": [{
            "type": "bank",
            "speed": {
                "unit": "days",
                "number": "2"
            }
       }]
    }]
}]
Ad

Answer

I think you have made some mistakes on your initial code, but I guess it is due to the confusion of dealing with so many layers of objects and arrays. This is what you should do:

const getValue = (source, typein, typeout, obj) => {

  const res = obj.map(item => {
    if (item['country_from'][0]['paymentIn'][0]['type'] === typein 
        && item['country_from'][0]['currency'].includes(source) 
        && item['country_from'][0]['paymentOut'][0]['type'] === typeout) {
      return `id: ${item['id']} credit: ${item['country_from'][0]['paymentIn'][0]['speed']['number']} days credit: ${item['country_from'][0]['paymentIn'][0]['fee']['number']}${item['country_from'][0]['paymentIn'][0]['fee']['type']} pay_in: pay_out: ${item['country_from'][0]['paymentOut'][0]['speed']['number']}`
    }
  });
  return res;

}

getValue('SGD', 'credit', 'bank', obj);

Basically, I will iterate through every element of the input array, obj (which is the one you posted on your question), and within each iteration, I check for the following 3 conditions using the if statement.

1) The paymentIntype matches typein

2) The paymentOuttype matches typein

3) currency contains source

Elements that fulfil the above 3 conditions will the string result.


EDIT: To answer your question on the comments, if the paymentIn array has more than one object, we can use Array.some() to check if the object with the type property has the same value as typeIn.

if (item['country_from'][0]['paymentIn'].some(payment => payment['type']===typein) 
  && item['country_from'][0]['currency'].includes(source) 
  && item['country_from'][0]['paymentOut'][0]['type'] === typeout) {

  // to get the object with that typein
  const filteredPaymentIn = item['country_from'][0]['paymentIn'].filter(payment => payment['type']===typein)[0];

}
Ad
source: stackoverflow.com
Ad