我试图在这里找到答案,但找不到可行的解决方案。 我有一个函数可以创建其中包含一些产品交付数据的数组,如下所示:
我的购物车中有两种产品,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/