请问后台返回的数组对象,前端根据某一个字段作为判断条件,判断重复数据项并将统计的重复次数渲染到页面?

根据里面的Data.NO,来判断是否重复 ,并新增一个”重复次数“字段来显示重复的次数,,
图片.png
我自己写出来的,每次获取后台数据,里面只要有重复数据,整个列表的”探测次数“字段都会变化。
图片.png
图片.png
求大佬帮忙解决一下,非常感谢!!!

阅读 1.9k
2 个回答
let list = [
    {
        DF:343,
        Fstep: 0.2,
        NO:1004
    },
    {
        DF:344,
        Fstep: 0.2,
        NO:1005
    },
    {
        DF:345,
        Fstep: 0.2,
        NO:1004
    },
    {
        DF:346,
        Fstep: 0.2,
        NO:1004
    },
    {
        DF:347,
        Fstep: 0.2,
        NO:1006
    },
    {
        DF:348,
        Fstep: 0.2,
        NO:1005
    }
]
let newArr = [], list1 = [], i = 0
let timer = setInterval(() => {
    if(i === list.length) {
      clearInterval(timer)
      return
    }
    // 模拟每3s后端返回一条数据
    list1 = [list[i]]
    i++
    fn(list1)
}, 3000)
function fn (arr) {
    newArr = arr.reduce((s, v) => {
        let index = s.findIndex(it => it.NO === v.NO)
        index !== -1  ? s[index] = {...v, startTime: s[index].startTime,
        endTime: getNowDate(), count: ++s[index].count} : s.push({...v, count: 1, startTime: getNowDate(), endTime: getNowDate()})
        return s
    }, newArr)
    console.log(newArr);
}
// 格式化日对象
const getNowDate = () => {
  var date = new Date();
  var sign2 = ":";
  var year = date.getFullYear() // 年
  var month = date.getMonth() + 1; // 月
  var day = date.getDate(); // 日
  var hour = date.getHours(); // 时
  var minutes = date.getMinutes(); // 分
  var seconds = date.getSeconds() //秒
  var weekArr = ['星期一', '星期二', '星期三', '星期四', '星期五', '星期六', '星期天'];
  var week = weekArr[date.getDay()];
  // 给一位数的数据前面加 “0”
  if (month >= 1 && month <= 9) {
    month = "0" + month;
  }
  if (day >= 0 && day <= 9) {
    day = "0" + day;
  }
  if (hour >= 0 && hour <= 9) {
    hour = "0" + hour;
  }
  if (minutes >= 0 && minutes <= 9) {
    minutes = "0" + minutes;
  }
  if (seconds >= 0 && seconds <= 9) {
    seconds = "0" + seconds;
  }
  return year + "-" + month + "-" + day + " " + hour + sign2 + minutes + sign2 + seconds;
}

你这种做法的复杂度太高了。

完全可以单独用一个对象,把 NO 作为键来判断就好了。

伪代码看起来像这个样子。

const counts = {}

for(...)
{
    if(counts[NO]){
        ++counts[NO].count
    }else{
        counts[NO] = Object.assign(item, {count: 1})
    }
}

console.log(Object.values(counts))
推荐问题