使用 ECMA5 JavaScript 根据日期参数对对象对象 (JSON) 进行排序,并查找以 "success" 作为参数的最新对象



我有点卡住了。首先,我知道有类似的问题,我已经尝试了各种不同的选择,但我只是错过了一些东西。我以前不必做这种类型的方法,所以我将感谢您的帮助和善意。

我知道我应该使用(我认为(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:如何根据日期对objects({{},{},{}}(JSON(的object进行排序parameter,然后

第 2 步:找到object成功parameter的最后日期

第 3 步:然后将其分配给var

这是我的JSON数据(objectsobject(:

{
"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": {
}
}

检索数据后我想排序的数据将是$scope.frequencyData.production_deploys.

期望的输出是:$scope.lastScuccessfulProductionDeploy = 正确的对象.date;

我看过的一些参考:

按日期对 JSON 进行排序

对 JavaScript 对象数组进行排序

除了给出的大 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);

对象属性不排序。您可以做的是筛选具有success属性(且大于 0(的production_deploys项。接下来是更改键以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);

要对对象对象进行排序,应创建一个外部键列表。 这是因为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( { 如果(根据某些排序标准,A 小于 B({ 返回 -1; } 如果(根据排序标准,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();

另一个解决方案。

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; })

被视为"成功== 1",如果需要其他条件,您可以进行更改。 适用于当前日期格式,但可能需要稍作更改以适应其他日期格式。

最新更新