Выдвинуть объект в новый массив на основе наибольшего значения и даты? В JavaScript - PullRequest
0 голосов
/ 11 ноября 2019

У меня есть объект, который содержит количество килограммов и несколько дат. Я пытаюсь перенести строки с уникальными датами в новый массив. Если есть строки, содержащие одну и ту же дату, только та, которая имеет самый высокий килограмм, должна быть помещена в новый массив. Если есть две даты с одинаковым килограммом, должна быть выбрана только одна.

Вот как это выглядит:

[{"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 ]

2 голосов
/ 11 ноября 2019

Вы можете уменьшить весь массив, используя 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);
0 голосов
/ 11 ноября 2019

Я думаю, что большая часть вашей проблемы - форматирование даты. попробуйте 14/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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...