js 获取数组对象中,不同id,相同日期和名称中最大的一天


                            const list = [
                            {
                              name: "张三",
                              id: 1,
                              amount: 1,
                              balance: 1,
                              date: "2022-01-02",
                            },
                            {
                              name: "张三",
                              id: 2,
                              amount: 1,
                              balance: 1,
                              date: "2022-01-04",
                            },
                            {
                              name: "张三",
                              id: 3,
                              amount: 15,
                              balance: 15,
                              date: "2022-01-05",
                            },
                            {
                                name: '张三',
                                id: 33,
                                amount: 33,
                                balance: 33,
                                date: '2022-01-05'
                            },
                            {
                              name: "张三",
                              id: 4,
                              amount: 1,
                              balance: 1,
                              date: "2022-02-01",
                            },
                            {
                              name: "张三",
                              id: 5,
                              amount: 1,
                              balance: 1,
                              date: "2022-02-02",
                            },
                            {
                              name: "张三",
                              id: 6,
                              amount: 26,
                              balance: 26,
                              date: "2022-02-06",
                            },
                            {
                                name: '张三',
                                id: 66,
                                amount: 66,
                                balance: 66,
                                date: '2022-02-06'
                            },
                            {
                              name: "李四",
                              id: 7,
                              amount: 1,
                              balance: 1,
                              date: "2022-01-02",
                            },
                            {
                              name: "李四",
                              id: 8,
                              amount: 1,
                              balance: 1,
                              date: "2022-01-03",
                            },
                            {
                              name: "李四",
                              id: 9,
                              amount: 215,
                              balance: 215,
                              date: "2022-01-05",
                            },
                            {
                              name: "李四",
                              id: 10,
                              amount: 1,
                              balance: 1,
                              date: "2022-02-01",
                            },
                            {
                              name: "李四",
                              id: 11,
                              amount: 1,
                              balance: 1,
                              date: "2022-02-03",
                            },
                            {
                              name: "李四",
                              id: 12,
                              amount: 225,
                              balance: 225,
                              date: "2022-02-05",
                            },
                            {
                              name: "李四",
                              id: 13,
                              amount: 1,
                              balance: 1,
                              date: "2022-03-01",
                            },
                            {
                              name: "李四",
                              id: 14,
                              amount: 1,
                              balance: 1,
                              date: "2022-03-05",
                            },
                            {
                              name: "李四",
                              id: 15,
                              amount: 236,
                              balance: 236,
                              date: "2022-03-06",
                            },
                            {
                              name: "李四",
                              id: 16,
                              amount: 212,
                              balance: 212,
                              date: "2022-03-06",
                            },
                            {
                              name: "李四",
                              id: 17,
                              amount: 234,
                              balance: 234,
                              date: "2022-03-06",
                            }
                          ];
                          [{
                                name: '张三',
                                id: 33,
                                amount: 15,
                                balance: 15,
                                date: '2022-01-05'
                            },{
                                name: '张三',
                                id: 66,
                                amount: 26,
                                balance: 26,
                                date: '2022-02-06'
                            },{
                                name: '李四',
                                id: 9,
                                amount: 215,
                                balance: 215,
                                date: '2022-01-05'
                            },{
                                name: '李四',
                                id: 12
                                amount: 225,
                                balance: 225,
                                date: '2022-02-05'
                            },{
                                name: '李四',
                                id: 17,
                                amount: 234,
                                balance: 234,
                                date: '2022-03-06'
                            }]

OK 稍等


代码如下

const list = [
    {
      name: "张三",
      id: 1,
      amount: 1,
      balance: 1,
      date: "2022-01-02",
    },
    {
      name: "张三",
      id: 2,
      amount: 1,
      balance: 1,
      date: "2022-01-04",
    },
    {
      name: "张三",
      id: 3,
      amount: 15,
      balance: 15,
      date: "2022-01-05",
    },
    {
        name: '张三',
        id: 33,
        amount: 33,
        balance: 33,
        date: '2022-01-05'
    },
    {
      name: "张三",
      id: 4,
      amount: 1,
      balance: 1,
      date: "2022-02-01",
    },
    {
      name: "张三",
      id: 5,
      amount: 1,
      balance: 1,
      date: "2022-02-02",
    },
    {
      name: "张三",
      id: 6,
      amount: 26,
      balance: 26,
      date: "2022-02-06",
    },
    {
        name: '张三',
        id: 66,
        amount: 66,
        balance: 66,
        date: '2022-02-06'
    },
    {
      name: "李四",
      id: 7,
      amount: 1,
      balance: 1,
      date: "2022-01-02",
    },
    {
      name: "李四",
      id: 8,
      amount: 1,
      balance: 1,
      date: "2022-01-03",
    },
    {
      name: "李四",
      id: 9,
      amount: 215,
      balance: 215,
      date: "2022-01-05",
    },
    {
      name: "李四",
      id: 10,
      amount: 1,
      balance: 1,
      date: "2022-02-01",
    },
    {
      name: "李四",
      id: 11,
      amount: 1,
      balance: 1,
      date: "2022-02-03",
    },
    {
      name: "李四",
      id: 12,
      amount: 225,
      balance: 225,
      date: "2022-02-05",
    },
    {
      name: "李四",
      id: 13,
      amount: 1,
      balance: 1,
      date: "2022-03-01",
    },
    {
      name: "李四",
      id: 14,
      amount: 1,
      balance: 1,
      date: "2022-03-05",
    },
    {
      name: "李四",
      id: 15,
      amount: 236,
      balance: 236,
      date: "2022-03-06",
    },
    {
      name: "李四",
      id: 16,
      amount: 212,
      balance: 212,
      date: "2022-03-06",
    },
    {
      name: "李四",
      id: 17,
      amount: 234,
      balance: 234,
      date: "2022-03-06",
    }
  ];
  [{
        name: '张三',
        id: 33,
        amount: 15,
        balance: 15,
        date: '2022-01-05'
    },{
        name: '张三',
        id: 66,
        amount: 26,
        balance: 26,
        date: '2022-02-06'
    },{
        name: '李四',
        id: 9,
        amount: 215,
        balance: 215,
        date: '2022-01-05'
    },{
        name: '李四',
        id: 12,
        amount: 225,
        balance: 225,
        date: '2022-02-05'
    },{
        name: '李四',
        id: 17,
        amount: 234,
        balance: 234,
        date: '2022-03-06'
    }]

let totalDict = {};
list.forEach(
    item=>{
        let dates = item["date"].split("-");
        let name = item["name"];
        let year = dates[0];
        let month = dates[1];
        let day = dates[2];
        if (!totalDict.hasOwnProperty(name)) {
          totalDict[name] = {};
        }
        if (!totalDict[name].hasOwnProperty(year)) {
          totalDict[name][year] = {};
        }
        if (!totalDict[name][year].hasOwnProperty(month)) {
          totalDict[name][year][month] = "0";
        }
        if (day > totalDict[name][year][month]) { 
          totalDict[name][year][month] = {
              'flag': false,
              'day': day
          };
        }
       
    }
);

let newList = [];

list.forEach((item) => {
  let name = item["name"];
  let dates = item["date"].split("-");
  let year = dates[0];
  let month = dates[1];
  let day = dates[2];
  if (
    totalDict[name][year][month]['day'] === day && totalDict[name][year][month]['flag'] === false
  ) {
    newList.push(item);
    totalDict[name][year][month]['flag'] === true
  }
});
console.log(newList);
// 需要整理成如下格式
// [{
//     name: '张三',
//     amount: 15,
//     balance: 15,
//     date: '2022-01-05'
// },{
//     name: '张三',
//     amount: 26,
//     balance: 26,
//     date: '2022-02-06'
// },{
//     name: '李四',
//     amount: 215,
//     balance: 215,
//     date: '2022-01-05'
// },{
//     name: '李四',
//     amount: 225,
//     balance: 225,
//     date: '2022-02-05'
// },{
//     name: '李四',
//     amount: 236,
//     balance: 236,
//     date: '2022-03-06'
// }]

你是想要 月份相等名称相等 系数最大是嘛?


//先记录为对象
var Result = {};
list.forEach(function(item,index){
    //以姓名和年月作为关键字
    var key =item.name + '_' + item.date.substring(0,7);
    //当第一次出现关键字或者当前项的值大于之前的就当前项记录
    if(!Result[key] || Result[key].amount<item.amount){        
        Result[key] = item;
    }
});
console.log(Result);
//转数组
var ResultArr = [];
for(var key in Result){
    ResultArr.push(Result[key]);
}
console.log(ResultArr);

function getNewData(list){
                    for(let x in list){
                        list[x].date = list[x].date.split('-')
                    }
                    let newArr = []
                    for(let i=0;i<list.length;i++){
                        if(i!=0 && list[i].name==newArr[newArr.length-1].name && list[i].date[0]==newArr[newArr.length-1].date[0] && list[i].date[1]==newArr[newArr.length-1].date[1]){
                            continue;
                        }
                        else{
                            let obj = list[i]
                            for(let j=i;j<list.length;j++){
                                if(obj.name==list[j].name && obj.date[0]==list[j].date[0] && obj.date[1]==list[j].date[1] && obj.date[2]<list[j].date[2]){
                                    obj = list[j]
                                }
                            }
                            newArr.push(obj)
                        }
                        
                    }
                    for(let x in newArr){
                        newArr[x].date = newArr[x].date.join("-")
                    }
                    return newArr
                }

给个例子做参考:

 var new_list = [];
        while(list.length>1){
            let info = list[0]
            let info1 = list[1];
            let name = info.name;
            let name1 = info1.name;
            let date = info.date.split('-');
            let date1 = info1.date.split('-');
            if(name==name1 && date[0]==date1[0] && date[1]==date1[1]){
                if(parseInt(date[2])>parseInt(date1[2])){
                    list.splice(0,1);
                }else{
                    list.shift();
                }
                if(list.length==1){
                    new_list.push(list[0]);
                }
            }else if(name==name1 && date[0]==date1[0] && date[1]!=date1[1]){
                new_list.push(list[0]);
                list.shift();
            }else if(name!=name1){
                new_list.push(list[0]);
                list.shift();
            }
        }
        console.log(new_list);

用了es6 的 map


const getArrayMax = (arr) => {
    let map = new Map()
    for (let item of arr) {
        const temp = item.date.substring(0,7)+'_'+item.name
        if (!map.has(temp) || item.amount > map.get(temp).amount) {
            map.set(temp, item)
        }
    }
    return [...map.values()]
}
console.log('arr', getArrayMax(list))


const tempMonthArr=[];
for(var i=0;i<list.length;i++){
    list[i].month=list[i].date.substring(0,7);
    list[i].day= parseInt(list[i].date.substring(8));
    var t= tempMonthArr.filter(item => {
            return item.month==list[i].month && item.name==list[i].name;
        })
    if( t&&t.length>0){
    var obj=t[0];
        //存在比对天数
        if(obj.day<=list[i].day){
            obj.date=list[i].date;
            obj.day=list[i].day;
        }
    }else{
        //不存在放入临时数组
        tempMonthArr.push(list[i]);
    }
}
console.log(tempMonthArr);

Object.values(list.reduce((p, c) => {
const dt = new Date(c.date)
const k = ${ dt.getFullYear() }-${ dt.getMonth() + 1 }
if (Object.keys(p).length === 0) {
p = {
[k]: [c]
}
} else {
if (p[k]) {
p[k].push(c)
} else {
p[k] = [c]
}
}
return p
}, {})).map(list => list.sort((e1, e2) => new Date(e2.date).getTime() - new Date(e1.date).getTime()).shift())

img

img


 
const getMax = (v) => {
    let map = new Map()
    for (let item of v) {
        const temp = item.date.substring(0,7)+'_'+item.name
        if (!map.has(temp) || item.amount > map.get(temp).amount) {
            map.set(temp, item)
        }
    }
    return [...map.values()]
}
console.log(getMax(list))

参考如下代码可实现

var array2=[];
      if(list && list.length>0){
        list.forEach((ele,index)=>{
          if(array2 && array2.length>0){
            for(var i=0;i<array2.length;i++){
              var time1=new Date(Date.parse(ele.date))
              var time2=new Date(Date.parse(array2[i].date))
              var timeMonth1=time1.getFullYear()+""+time1.getMonth()
              var timeMonth2=time2.getFullYear()+""+time2.getMonth()
              if(array2[i].name==ele.name && timeMonth1==timeMonth2){
                if(time1 > time2 || ele.id>array2[i].id){
                  array2[i]=ele
                }
              }
              else{
                array2.push(ele)
              }
            }
            array2=this.unique(array2)
          }
          else{
            array2.push(ele)
          }
        })
      }
    },
    unique(arr) {
      const res = new Map();
      return arr.filter((arr) => !res.has(arr.id) && res.set(arr.id, 1));
    },

本题思路我认为可以分成三个部分,首先要“”不同Id“”,其次相同的日期(至少年月是相同的天数不同)和相同的名称(也就是name)

其实开发中可以select数据库语句就可以了,可见楼主也是小菜鸟一个(抱歉我这么称呼),解题思路首先对id 排序,然后对每个id的相同日期和名称的item进行排序,最后比较天数,取最大的那个天数,这样对数据进行重新整理,就能得到你想要的数据,比如id=1

其中日期和名称相同的数据,然后天数取最大的一个,所以对每个(i=0;i<list.length;i++)进行list.id判断,和进行list.name判断,截取数据date用函数subString(start,end)函数截取后两个数据,然后比较数据大小用math.max()函数就可以了,

已解决!



<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<style>

</style>

<body>

</body>
<script>

    const list = [
        {
            name: "张三",
            id: 1,
            amount: 1,
            balance: 1,
            date: "2022-01-02",
        },
        {
            name: "张三",
            id: 2,
            amount: 1,
            balance: 1,
            date: "2022-01-04",
        },
        {
            name: "张三",
            id: 3,
            amount: 15,
            balance: 15,
            date: "2022-01-05",
        },
        {
            name: '张三',
            id: 33,
            amount: 33,
            balance: 33,
            date: '2022-01-05'
        },
        {
            name: "张三",
            id: 4,
            amount: 1,
            balance: 1,
            date: "2022-02-01",
        },
        {
            name: "张三",
            id: 5,
            amount: 1,
            balance: 1,
            date: "2022-02-02",
        },
        {
            name: "张三",
            id: 6,
            amount: 26,
            balance: 26,
            date: "2022-02-06",
        },
        {
            name: '张三',
            id: 66,
            amount: 66,
            balance: 66,
            date: '2022-02-06'
        },
        {
            name: "李四",
            id: 7,
            amount: 1,
            balance: 1,
            date: "2022-01-02",
        },
        {
            name: "李四",
            id: 8,
            amount: 1,
            balance: 1,
            date: "2022-01-03",
        },
        {
            name: "李四",
            id: 9,
            amount: 215,
            balance: 215,
            date: "2022-01-05",
        },
        {
            name: "李四",
            id: 10,
            amount: 1,
            balance: 1,
            date: "2022-02-01",
        },
        {
            name: "李四",
            id: 11,
            amount: 1,
            balance: 1,
            date: "2022-02-03",
        },
        {
            name: "李四",
            id: 12,
            amount: 225,
            balance: 225,
            date: "2022-02-05",
        },
        {
            name: "李四",
            id: 13,
            amount: 1,
            balance: 1,
            date: "2022-03-01",
        },
        {
            name: "李四",
            id: 14,
            amount: 1,
            balance: 1,
            date: "2022-03-05",
        },
        {
            name: "李四",
            id: 15,
            amount: 236,
            balance: 236,
            date: "2022-03-06",
        },
        {
            name: "李四",
            id: 16,
            amount: 212,
            balance: 212,
            date: "2022-03-06",
        },
        {
            name: "李四",
            id: 17,
            amount: 234,
            balance: 234,
            date: "2022-03-06",
        }
    ];

    // 获取数组对象中,不同id,相同日期和名称中最大的一天

    function max({ different = [], TheSame = [], arr = [], target = "", type = 'all' }) {
        // console.log(TheSame, different, '===')
        let total = [];
        arr.forEach((item, index) => {
            let i = total.findIndex((sitem, sindex) => {
                if (sitem) {
                    // console.log(sitem, '==sitem')
                    return sitem.some((kitem) => {
                        return TheSame.every(hitem => {
                            return kitem[hitem] == item[hitem]
                        })

                    })
                }

            })
            if (i != -1) {
                total[i].push(item)
            } else {
                total.push([item])
            }

        })

        let List = total.map((item) => {
            return Math.max.apply(null, item.map((item => {
                if (typeof item[target] == 'string' && item[target].indexOf('-')) {
                    return item[target].replace(/-/g, '') * 1
                } else if (typeof item[target] == 'number') {
                    return item[target]
                } else {
                    return 0
                }

            })));
        })

        if (type == 'all') {
            let maxList = total.map((item, index) => {
                return item.find(zitem => {
                    if (typeof zitem[target] == 'string' && zitem[target].indexOf('-')) {
                        return zitem[target].replace(/-/g, '') == List[index]
                    } else if (typeof zitem[target] == 'number') {
                        return zitem[target] == List[index]
                    } else {
                        return 0
                    }
                })
            })

            return maxList
        } else if (type == 'every') {
            let max = Math.max(...List)

            let maxList = arr.filter((item, index) => {
                return item[target] == max
            })

            return maxList
        }



    }
    // console.log(list.length, '===')
    console.log(max({ different: ['id'], TheSame: ['date', 'name'], arr: list, target: 'id', type: 'every' }))

    // different 不同参数
    // TheSame   相同参数
    // arr       传入参数
    // target    最大参数
    // type      分类类型  every 数组最最大一个  all 分类最大数据

</script>

</html>