javascript - Jquery从单独的数组中获取特定对象的最高值

标签 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。在此函数中,有一个来自 vendor 的对 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)

非常感谢任何帮助!

最佳答案

好吧,希望这次编辑就是这样,首先看起来您现在遇到了异步问题,您想等待所有请求返回然后再继续。

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

我在 getAllItems 中的 matched_variant.push() 周围添加了 [],希望能够获得您想要的问题 #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>

关于javascript - Jquery从单独的数组中获取特定对象的最高值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55520286/

相关文章:

jquery - 将 Swipebox Caption 从标题属性更改为 Alt 标签或 Caption 标签

json - JSON 字符串中出现意外的 nil

javascript - 多次更改iframe源

javascript - 基础顶栏切换不起作用

javascript - 引导轮播 : Uncaught TypeError: Cannot read property 'offsetWidth' of undefined

javascript - 嵌套 Bootstrap 可折叠按钮的 jQuery show.bs.collapse 事件在比预期更多的按钮上触发

javascript - 如何从 Internet Explorer 获取在 JavaScript 中打开窗口的 iframe?

javascript - jQuery。按类名检查每一项

javascript - 从不同的键创建多层对象:value pairs

php - 使用PHP的Elasticsearch多个术语搜索Json Query构建器