我试图在这里找到答案,但是找不到可行的解决方案。 我有一个函数可以创建包含一些产品交付数据的数组,如下所示:
我的购物车中有两个产品,其中的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)
?
任何帮助都将不胜感激!
答案 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)