javascript - 从一个键重复且另一个键小于另一个键的数组中删除对象

标签 javascript arrays node.js duplicates

我有这个包含对象的数组:

var data=[
    { number: '31907411282', unix_date: '1547012427' },
    { number: '31907411282', unix_date: '1547013214' },
    { number: '31907514691', unix_date: '1547015155' },
    { number: '31907514691', unix_date: '1547015232' },
    { number: '31907514691', unix_date: '1547016134' },
    { number: '31907514691', unix_date: '1547016443' },
    { number: '31907638716', unix_date: '1547017122' },
    { number: '31907644067', unix_date: '1547017381' }
]

我如何删除具有较新日期的重复对象并获得这样的新数组:

var new_data=[
    { number: '31907411282', unix_date: '1547012427' },
    { number: '31907514691', unix_date: '1547015155' },
    { number: '31907638716', unix_date: '1547017122' },
    { number: '31907644067', unix_date: '1547017381' }
]

我不明白如何完成所有程序。 谢谢

更新

我试试这个结构:

  1. 首先我们需要对对象进行分组和排序
  2. 第二步是从分组中获取第一个对象并推送到新数组

代码:

var data=[
    { number: '31907411282', unix_date: '1547012427' },
    { number: '31907411282', unix_date: '1547013214' },
    { number: '31907514691', unix_date: '1547019134' },
    { number: '31907514691', unix_date: '1547015232' },
    { number: '31907514691', unix_date: '1547016134' },
    { number: '31907514691', unix_date: '1547016443' },
    { number: '31907638716', unix_date: '1547017122' },
    { number: '31907644067', unix_date: '1547017381' }
]

var new_data=[];
var groupByNumber=groupBy(data, 'number');
for(i in groupByNumber){
    var sort_arr=groupByNumber[i].sort(compare)
    new_data.push(sort_arr[0])
}

console.log(new_data)

function compare(a, b) {
  let comparison = 0;
  if (a.unix_date > b.unix_date) {
    comparison = 1;
  } else if (a.unix_date < b.unix_date) {
    comparison = -1;
  }
  return comparison;
}

function groupBy(xs, key) { //group by key
    return xs.reduce(function(rv, x) {
        (rv[x[key]] = rv[x[key]] || []).push(x);
        return rv;
    }, {});
};

也许它可以更优雅

更新 2

@miroslav-glamuzina 给出更优雅的方式:

let filtered = data.reduce((acc, item) => {
  if (!acc.some((e, i) => {
      if (item.number === e.number) {
        if (item.unix_date < e.unix_date) {
          acc.splice(i, 1, item);
        }
        return true;
      }
    })) {
    acc.push(item);
  }
  return acc;
}, []);

最佳答案

您可以使用reduce 遍历数组并存储一组键(number) 来检查它是否存在。然后插入新数组。

var data=[
    { number: '31907411282', unix_date: '1547012427' },
    { number: '31907411282', unix_date: '1547013214' },
    { number: '31907514691', unix_date: '1547015155' },
    { number: '31907514691', unix_date: '1547015232' },
    { number: '31907514691', unix_date: '1547016134' },
    { number: '31907514691', unix_date: '1547016443' },
    { number: '31907638716', unix_date: '1547017122' },
    { number: '31907644067', unix_date: '1547017381' }
]
const rs = data.reduce((acc, e) => {
  if(!acc.number.has(e.number)) {
    acc.newData.push(e)
    acc.number.add(e.number)
  }
  return acc
}, {number: new Set(), newData: []})

console.log(rs.newData)

关于javascript - 从一个键重复且另一个键小于另一个键的数组中删除对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55213499/

相关文章:

javascript - 选择覆盖时隐藏图像轮播上一个/下一个箭头

c - C中的内存溢出混淆

java - 对于任何产品来说,选择 Nodejs 而不是 ASP.NET 或 Java 有何缺点?

javascript - 使用jquery在div中显示加载图标

javascript - 为什么当我关闭并重新打开 react 组件( Material 表)时会发生内存泄漏并渲染速度变慢?

javascript - 如何动态添加国家标记?

node.js - 在 ExpressJS 中为特定路由链接多个中间件

javascript - knockout foreach 子数组未显示

java - 对java赋值方法的困惑

node.js - 继承 Mongoose 模式