我有点卡住了。首先,我知道有类似的问题,我尝试了各种不同的选择,但我只是遗漏了一些东西。我以前没有必要做这种方法,所以我很感激你的帮助和善意。
我知道我应该使用(我认为)Object.keys
和.map
,以及一个看起来像这样的函数:
function comp(a, b) {
return new Date(a.result.date).getTime() - new Date(b.result.date).getTime();
}
但我正努力让它发挥作用。
我尝试过:
var uptime = $scope.frequencyData.production_deploys;
var myObjects = Object.keys(uptime).map(function (itm) {
return uptime[itm];
});
var arr = [];
for (key in uptime) {
uptime[key].time = key;
arr.push(uptime[key]);
}
arr.sort(function (a, b) {
return new Date(a.time) - new Date(b.time);
});
但是这创建了一个没有日期的array
。
我尝试过:
uptime = Object.keys($scope.frequencyData.production_deploys);
但这创建了array
只有日期
所以这是我的问题:
第1步:如何根据日期{{1}对object
objects
parameter
{{},{},{}}(JSON)进行排序然后
第2步:查找上次日期,object
成功 {/ 1} >
第3步:然后将其分配给parameter
?
这是我的JSON数据(var
的{{1}}):
object
我想在检索数据后排序的数据是objects
。
所需的输出:$ scope.lastScuccessfulProductionDeploy =正确的object.date;
我看过一些参考文献:
答案 0 :(得分:2)
除了使用错误的大O(过滤,映射,排序)给出的答案之外,您可以使用Array#reduce
的单循环方法。
var data = { production_deploys: { "2017-07-08": { failures: 2, success: 1 }, "2017-07-09": { failures: 2, success: 1 }, "2017-07-10": { failures: 2, success: 3 }, "2017-07-11": { failures: 2, success: 10 }, "2017-07-12": { failures: 2, success: 2 }, "2017-07-13": { failures: 2, success: 2 }, "2017-07-14": { failures: 2, success: 1 }, "2017-07-15": { failures: 2, success: 1 }, "2017-07-16": { failures: 2, success: 1 }, "2017-07-17": { failures: 2, success: 3 }, "2017-07-18": { failures: 2, success: 10 } }, pull_requests: {}, test_deploys: {}, uptime: {} },
result = Object.keys(data.production_deploys).reduce(function (r, a) {
return !data.production_deploys[a].success || r > a ? r : a;
}, '');
console.log(result);
答案 1 :(得分:1)
要对对象的对象进行排序,您应该创建一个外部的键列表。 这是因为Javascript不保证对象的键是可排序的。
var sortedKeys = Object.keys(myObject).sort(mySortFunction);
如果要访问此对象,请使用指向此列表的函数。
如果您的对象发生了变化,您应该相应地更新列表。
第2点是微不足道的,您不需要任何订单,只需浏览对象kesy并找到您要查找的属性值的最后日期。
var lastDateObject = null;
var lastDate = null;
for (let keyName in myObject) {
if (elementHasSuccess(myObject[keyName]) && compareDates(lastDate, keyName)) {
lastDateObject = Object.assign({}, myObject[keyName]);
}
}
或类似的东西,也解决了第三点。
<强>更新强>
用于排序列表的函数应具有以下签名:
功能比较(a,b){ if(a按某些排序标准小于b){ 返回-1; } if(a按排序标准大于b){ 返回1; } // a必须等于b 返回0; }
从Mozilla文档中获取:https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/sort
在您的情况下,您要比较日期,您可以先在日期中转换字符串:
var dateA = new Date(a);
var dateB = new Date(b);
然后返回时间戳的差异(毫秒):
return dateA.getTime()-dateB.getTime();
答案 2 :(得分:1)
未订购对象属性。您可以做的是过滤具有production_deploys
属性(且大于0)的success
项。接下来是将密钥更改为Date
个对象。最后,您首先对数组进行排序,然后获取第一个项目。
var sorted = Object.keys(data.production_deploys)
.filter(function (deployDate) {
return data.production_deploys[deployDate].success &&
data.production_deploys[deployDate].success > 0;
})
.map(function (deployDate) {
return new Date(deployDate);
})
.sort(function (a, b) {
return b.getTime() - a.getTime();
});
var latestSuccessfulDate = sorted[0];
var data = {
"production_deploys": {
"2017-07-08": {
"failures": 2,
"success": 1
},
"2017-07-09": {
"failures": 2,
"success": 1
},
"2017-07-10": {
"failures": 2,
"success": 3
},
"2017-07-11": {
"failures": 2,
"success": 10
},
"2017-07-12": {
"failures": 2,
"success": 2
},
"2017-07-13": {
"failures": 2,
"success": 2
},
"2017-07-14": {
"failures": 2,
"success": 1
},
"2017-07-15": {
"failures": 2,
"success": 1
},
"2017-07-16": {
"failures": 2,
"success": 1
},
"2017-07-17": {
"failures": 2,
"success": 3
},
"2017-07-18": {
"failures": 2,
"success": 10
}
},
"pull_requests": {
},
"test_deploys": {
},
"uptime": {
}
};
var sorted = Object.keys(data.production_deploys)
.filter(function (deployDate) {
return data.production_deploys[deployDate].success &&
data.production_deploys[deployDate].success > 0;
})
.map(function (deployDate) {
return new Date(deployDate);
})
.sort(function (a, b) {
return b.getTime() - a.getTime();
});
var latestSuccessfulDate = sorted[0];
console.log(latestSuccessfulDate);
答案 3 :(得分:0)
还有一个解决方案..
var tt1 = Object.keys(tt.production_deploys)
.map(function(ke) { if (tt.production_deploys[ke].success == "1") { tt.production_deploys[ke].date = ke; return tt.production_deploys[ke] } })
.filter(function (itm) { return itm !== undefined; })
.reduce(function (a, b) { return a.date > b.date ? a.date : b.date; })
考虑&#34;成功== 1&#34;如果需要其他标准,您可以更改。使用当前日期格式可以正常工作,但可能需要稍作更改才能适应其他日期格式。