使用ECMA5 JavaScript根据日期参数对对象(JSON)进行排序,并使用"成功"找到最新对象。作为参数

时间:2017-07-19 11:31:32

标签: javascript json sorting

我有点卡住了。首先,我知道有类似的问题,我尝试了各种不同的选择,但我只是遗漏了一些东西。我以前没有必要做这种方法,所以我很感激你的帮助和善意。

我知道我应该使用(我认为)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;

我看过一些参考文献:

sort JSON by date

Sorting an array of JavaScript objects

4 个答案:

答案 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;如果需要其他标准,您可以更改。使用当前日期格式可以正常工作,但可能需要稍作更改才能适应其他日期格式。