Jquery получить наибольшее значение конкретного объекта из отдельных массивов - PullRequest
0 голосов
/ 04 апреля 2019

Я пытался найти ответ здесь, но я не могу найти рабочее решение. У меня есть функция, которая создает массивы с некоторыми данными о доставке продукта, например:

У меня есть два продукта в корзине, с таким html:

<div class="prod" data-pid="41853029" data-vid="79380299" data-qty="1">....<div>
<div class="prod" data-pid="41853029" data-vid="79380296" data-qty="3">....<div>

Далее я собираю всю информацию из продуктов в корзине, вот так:

$(function(){
  $('.prod').each(function(){  
   var vid = $(this).data('vid')
   var url = 'link-to-api/api/stock/'+$(this).data('pid')+'?secret=secret&quantity='+$(this).data('qty')
   getAllItems(url, vid)
  });
});

Указанные выше данные отправляются в функцию getAllItems. В этой функции есть вызов JSON API от поставщика. Отсюда я хочу вернуть массив с двумя другими массивами, которые содержат новые данные из API. Что-то вроде этого:

 // "main" array
 [
  // array with product data for product 1
  [
    {
      "id": 79380299,
      "dt": 1,
      "dtt": "Voor 17:00 uur = morgen in huis",
      "co": "17:00",
      "sid": 5
    }
  ],
  // array with product data for product 2
  [
    {
      "id": 79380296,
      "dt": 3,
      "dtt": "Voor 15:00 uur besteld, over 3 werkdagen in huis",
      "co": "15:00",
      "sid": 5
    }
  ]
 ]

Когда у меня есть этот «основной» массив, я хочу отфильтровать этот массив по значению dt (что означает время доставки). После фильтрации я хочу отправить отдельный массив с самым высоким значением dt в новую функцию. Я пробовал что-то вроде кода ниже:

 function getAllItems(url, vid){

  var matched_variant = []
  $.getJSON(url, function(data){
    $.each(data.variants, function(i, variant){
     if(variant.id == vid){
      matched_variant.push({
        id: variant.id, 
        dt: variant.deliveryTimeInDays, 
        dtt: variant.deliveryTime, 
        co: variant.cutOffTime, 
        sid: variant.supplier_id
      });
     } 
    });
  }).done(function(){

  let matched = matched_variant
  let highest = {dt: 0};

  matched.forEach((arr, arrIndex) => {
    arr.forEach(dtObj => {
      let dt = parseInt(dtObj.dt)
      if (dt > highest.dt) {
        highest = dtObj;
      }
    })
  });
  let highestDTArray = [highest];
  setDeliveryDate(array_with_highest_dt_value)
  });
}

Для полноты данных JSON:

{
  "id": 41853029,
  "variants": {
    "79380290": {
      "id": 79380290,
      "supplier_id": 5,
      "on_stock": "no",
      "levelLocal": 0,
      "levelSupplier": 0,
      "deliveryTime": "out of stock",
      "cutOffTime": "15:00",
      "deliveryTimeInDays": -1
    },
    "79380293": {
      "id": 79380293,
      "supplier_id": 5,
      "on_stock": "no",
      "levelLocal": 0,
      "levelSupplier": 0,
      "deliveryTime": "out of stock",
      "cutOffTime": "15:00",
      "deliveryTimeInDays": -1
    },
    "79380296": {
      "id": 79380296,
      "supplier_id": 5,
      "on_stock": "supplier",
      "levelLocal": 1,
      "levelSupplier": 250,
      "deliveryTime": "Three days",
      "cutOffTime": "15:00",
      "deliveryTimeInDays": 3
    },
    "79380299": {
      "id": 79380299,
      "supplier_id": 5,
      "on_stock": "supplier",
      "levelLocal": 2,
      "levelSupplier": 250,
      "deliveryTime": "One day",
      "cutOffTime": "15:00",
      "deliveryTimeInDays": 1
    }
  }
}

Два вопроса:

1) С помощью приведенного выше кода я изо всех сил пытаюсь создать массив main с двумя другими массивами в нем. Как создать один массив с массивами данных о продукте?

2) Как сравнить это dt значение и вернуть его, чтобы его можно было отправить в функцию setDeliveryDate(array_with_highest_dt_value)?

Любая помощь с благодарностью!

Ответы [ 2 ]

3 голосов
/ 05 апреля 2019

Хорошо, надеюсь, это правка, во-первых, похоже, что у вас сейчас проблема с асинхронностью, вы хотите дождаться возвращения всех запросов, прежде чем продолжить.

Я справляюсь с этим с помощью переменной numReqFinished, вы можете видеть, что после каждого ответа я увеличиваю это число.Когда он достигнет числа продуктов, которое у вас есть в цикле, мы знаем, что у нас есть ответ для каждого продукта, и мы позвоним getHighestDTFromArray(), чтобы продолжить.

Я добавил [] вокруг matched_variant.push() вgetAllItems мы надеемся получить результат, который вы хотели получить по вопросу № 1

getAllItems() в значительной степени, как я и писал изначально.

Возможно, что-то из этого может быть изменено, поскольку я ещеЯ проверил его, но идея должна быть достаточной, чтобы помочь вам двигаться.

Примечание : важно parseInt значение dt, прежде чем сравнивать его, так какхранится в виде строки.

Например:

var matched_variant = [];
var numReqFinished = 0;

$(function() {
  $('.prod').each(function() {
    var vid = $(this).data('vid')
    var url = 'link-to-api/api/stock/' + $(this).data('pid') + '?secret=secret&quantity=' + $(this).data('qty');
    getAllItems(url, vid, $('.prod').length)
  });
});

function getAllItems(url, vid, totalProds) {
  $.getJSON(url, function(data) {
    numReqFinished++;

    $.each(data.variants, function(i, variant) {
      if (variant.id == vid) {
        matched_variant.push([{
          id: variant.id,
          dt: variant.deliveryTimeInDays,
          dtt: variant.deliveryTime,
          co: variant.cutOffTime,
          sid: variant.supplier_id
        }]);
      }
    });
    if (totalProds === numReqFinished) {
      getHighestDTFromArray();
    }
  })
}

function getHighestDTFromArray() {
  let matched = matched_variant
  let highest = {
    dt: 0
  };

  matched.forEach((arr, arrIndex) => {
    arr.forEach(dtObj => {
      let dt = parseInt(dtObj.dt)
      if (dt > highest.dt) {
        highest = dtObj;
      }
    })
  });
  let highestDTArray = [highest];
  setDeliveryDate(array_with_highest_dt_value)
});
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<div class="prod" data-pid="41853029" data-vid="79380299" data-qty="1">....
</div>

<div class="prod" data-pid="41853029" data-vid="79380296" data-qty="3">....
</div>
0 голосов
/ 05 апреля 2019

Сравните значение dt со статическим значением.

var biggest= Number.MIN_SAFE_INTEGER;
var array_with_highest_dt_value;
$.each(matched, function(){
 $.each(this, function(i, variant){
   if(variant.dt > biggest) {
      biggest = variant.dt;
      // Put a reference for later
      array_with_highest_dt_value= this;
   }      
 });
});
setDeliveryDate(array_with_highest_dt_value)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...