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);
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);
}
添加回答
举报