为了账号安全,请及时绑定邮箱和手机立即绑定

根据最大值和日期将对象推送到新数组?在 JavaScript 中

根据最大值和日期将对象推送到新数组?在 JavaScript 中

慕婉清6462132 2021-12-23 14:17:07
我有一个包含公斤数和一些日期的对象。我想要做的是将具有唯一日期的行推送到新数组。如果有包含相同日期的行,则只应将千克最高的行推送到新数组。如果有两个相同公斤的日期,则只能选择一个。这是它的样子:[{"kg":10,"date":"14/10/2019"},{"kg":15,"date":"14/10/2019"},{"kg":15,"date":"14/10/2019"},{"kg":5,"date":"15/10/2019"},{"kg":10,"date":"16/10/2019"}]以下是新数组中的结果:{"kg":15,"date":"14/10/2019"},{"kg":5,"date":"15/10/2019"},{"kg":10,"date":"16/10/2019"}]现在我不知道如何检查公斤并获得最高的公斤。我知道我可以使用“Math.max”来获得最高值,但不知道如何仅在相同日期使用它。我一直在尝试一些 foreach 循环,但我无法理解如何对日期进行分组并执行 Math.max。我真的需要一些指导。注:语言为 Javascript。
查看完整描述

2 回答

?
莫回无

TA贡献1865条经验 获得超7个赞

您可以使用 Array#reduce 减少整个数组。


const arr = [{"kg":10, "date": "14/10/2019"},

{"kg":15, "date": "14/10/2019"},

{"kg":15, "date": "14/10/2019"},

{"kg":5, "date": "15/10/2019"},

{"kg":10, "date": "16/10/2019"}];


const o = Object.values(arr.reduce((s, a) => {

   if (s[a.date]) { // check if that date already exist in the result obj

      if (s[a.date].kg < a.kg) {


         s[a.date] = a; // assign a new value only if has higher "kg" than current

      }

   } else {

      s[a.date] = a; // if doesnt exist yet, assign it anyways to our obj

   }

   

   return s;

}, {}));


console.log(o);


查看完整回答
反对 回复 2021-12-23
?
一只萌萌小番薯

TA贡献1795条经验 获得超7个赞

我认为您的问题的很大一部分是日期格式。尝试 10/14/2019 而不是 14/10/2019。


之后,您始终可以通过创建日期对象并在该对象上使用 getDate() 方法来获取要比较的值,然后您就可以进行所需的比较。


这是一个在单遍 for 循环中工作的简单示例。我首先对数据进行排序,以防您最终得到乱序的数据,但如果您确定日期始终按时间顺序排列,则可以将其删除。我能够一次性完成此操作的方法是假设数组按日期从最旧的开始和最新的日期排序。


一定要记住数组对象是引用类型。如果您需要这些值,请确保制作足够深的副本。


compressArray();


function compressArray() {

    var orignialArray =

    [{ "kg": 12, date: new Date('10/17/2019') },

    { "kg": 11, date: new Date('10/14/2019') },

    { "kg": 15, date: new Date('10/14/2019') },

    { "kg": 5, date: new Date('10/15/2019') },

    { "kg": 15, date: new Date('10/16/2019') }];

    //first sort data in case the data is out of order

    orignialArray = orignialArray.sort((a, b) => a.date.getDate() - b.date.getDate());

    console.log(orignialArray); //after sorting


    var compressedArray = new Array();

    compressedArray.push(orignialArray[0]); // seed array

    let j = 0; // this will be my index of the "compressed" array

    for (let i = 0; i < orignialArray.length; i++)

    {

        if (orignialArray[i].date.getDate() == compressedArray[j].date.getDate()) {

            compressedArray[j].kg = Math.max(orignialArray[i].kg, compressedArray[j].kg);

        }

        else

        { 

            j++; //move compressed array index

            compressedArray[j] = orignialArray[i];

        }

         console.log("i: " + i + "and j: " + j);

    }

    console.log(compressedArray);

}


查看完整回答
反对 回复 2021-12-23
  • 2 回答
  • 0 关注
  • 105 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信