gpt4 book ai didi

javascript - 将两个 $.each() 循环重构为一个

转载 作者:行者123 更新时间:2023-11-29 15:35:31 29 4
gpt4 key购买 nike

我有一个像这样的 JSON 对象......

{  
"tasks":[
{
"id":"task_3",
"taskName":"Task A",
"assignee":"Barrack Obama",
"timeReqOptimisitic":"4",
"timeReqNormal":"8",
"timeReqPessimistic":"14",
"timeUnit":"Days",
"timeReq":"8.33",
"positionX":493,
"positionY":101,
"lockStatus":"unlocked"
}
],
"milestones":[
{
"id":"task_1",
"milestoneName":"Start",
"positionX":149,
"positionY":109,
"lockStatus":"unlocked",
"milestoneDate":"2015-04-07"
},
{
"id":"task_2",
"milestoneName":"Finish",
"positionX":989,
"positionY":367,
"lockStatus":"unlocked",
"milestoneDate":"2015-04-22"
}
],
"connections":[
{
"connectionId":"con_10",
"pageSourceId":"task_1",
"pageTargetId":"task_3"
},
{
"connectionId":"con_20",
"pageSourceId":"task_3",
"pageTargetId":"task_2"
}
]
}

...这是一个最小版本。在实践中,“任务”、“里程碑”和“连接”中的项目数不胜数。

我需要遍历对象并确定具有最低/最早“milestoneDate”的“milestones”项目的“id”,然后识别与其“pageSourceId”具有相同值的“connections”项目并返回它的“pageTargetId”。

所以在上面的例子中:

步骤 1) 遍历对象并确定具有最低/最早“milestoneDate”的“milestones”项目的“id”。

答案:milestones.id = "task_1"

第 2 步) 识别与其“pageSourceId”具有相同值的“连接”项。

答案:connections.pageSourceId = "task_1"

第 3 步)返回其“pageTargetId”。

答案:“task_3”

我有一个工作示例 here .但是,我想知道是否有一种方法可以在不使用极高的开始日期并且在一个循环中完成此任务。

最佳答案

由于您没有在这两个循环中解析同一个数组,因此无法合并您的循环。

无论如何,您仍然可以删除访问数组的循环:

http://jsfiddle.net/gael/sruvtwre/2/

$.each(object.milestones, function( index, value ) {
if(startDate > parseDate(value.milestoneDate)) {
startDate = parseDate(value.milestoneDate);
id = value.id
}
});

$.each(object.connections, function( index, value ) {
if(id == value.pageSourceId) {
pageTargetId = value.pageTargetId;
}
});

也可能对您的数据进行排序和索引。那么你就不需要循环了:

milestones 中的元素应该排序,所以最早的 milestones 元素将是 milestones[0]。

connections 中的元素应由其 pageTargetId 属性索引,因此请求的元素应为 connections[id]。

你的两个循环会变成:

var pageTargetId= object.connections[ object.milestones[0].id ].pageTargetId;

http://jsfiddle.net/gael/sruvtwre/4/

正如评论中所说,排序不是最佳解决方案,即使这对于小集合来说并不重要。大致上,不需要对所有数据进行排序,只需要最新的即可。

您可以使用 array reduce method ,作为简单循环的替代方案:

var latestMilestone= object.milestones.reduce(function(milestone1, milestone2){

if( parseDate(milestone1.milestoneDate) > parseDate(milestone2.milestoneDate) )
return milestone1;
else
return milestone2;

//convert date to timestamp
function parseDate(date) {
var parts = date.split('-');
return Date.UTC(parts[0], parts[1]-1, parts[2]); // Note: months are 0-based
}

});

关于javascript - 将两个 $.each() 循环重构为一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29726494/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com