jQuery从单独的数组中获得特定对象的最高价值

时间:2019-04-04 15:54:18

标签: javascript jquery json ajax

我试图在这里找到答案,但是找不到可行的解决方案。 我有一个函数可以创建包含一些产品交付数据的数组,如下所示:

我的购物车中有两个产品,其中的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。在此功能中,供应商有一个对API的JSON调用。从这里我想返回一个数组,其中包含另外两个包含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 个答案:

答案 0 :(得分:3)

好吧,希望此编辑是一个,首先看起来您现在有一个异步问题,您想等待所有请求返回后再继续。

我使用numReqFinished变量来处理此问题,您可以看到在每个响应返回后,我都会增加该数字。当其达到循环中可用产品的数量时,我们知道每个产品都有响应,那么我们将致电getHighestDTFromArray()继续进行。

我在[]的{​​{1}}周围添加了matched_variant.push(),希望得到您对问题#1想要的结果

getAllItems几乎和我最初写的一样。

其中一些可能需要调整,因为我还没有测试过,但是这个想法应该足以帮助您前进。

注意:它在比较dt值之前也parseInt很重要-因为它以字符串形式存储。

例如:

getAllItems()
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)
});
}

答案 1 :(得分:0)

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