Получить значение объекта на основе входных объектов в JavaScript - PullRequest
0 голосов
/ 29 марта 2019

Я хотел бы узнать, как получить значение на основе входных объектов в JavaScript. Если источник соответствует валюте, а также соответствует типу paymentin и paymentout в объекте, тогда получите значение скорости и сборов

например, 'SGD' с type_in 'credit' и type_out 'bank' должны вернуть скорость и комиссию

Ожидаемый результат:

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

Я пытался, но застрял

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"
            }
       }]
    }]
}]

1 Ответ

0 голосов
/ 29 марта 2019

Я думаю, что вы допустили некоторые ошибки в своем исходном коде, но я полагаю, что это из-за путаницы при работе с таким количеством слоев объектов и массивов.Вот что вы должны сделать:

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);

По сути, я буду перебирать каждый элемент входного массива, obj (тот, который вы опубликовали в своем вопросе), и в каждой итерации япроверьте следующие 3 условия, используя оператор if.

1) paymentIn type соответствует typein

2) paymentOut type соответствует typein

3) currency содержит source

Элементы, которые удовлетворяют вышеуказанным 3 условиям, будут иметь строковый результат.


РЕДАКТИРОВАТЬ: Чтобы ответить на ваш вопрос в комментариях, если массив paymentIn имеет более одного объекта, мы можем использовать Array.some (), чтобы проверить, имеет ли объект со свойством type то же значение, что и 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];

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...