Javascript 从对象数组中删除重复项

Javascript 从对象数组中删除重复项,javascript,node.js,Javascript,Node.js,我有一个javascript对象数组,其中包含一些键和值。下面是我的数组的外观 [ { "timestamp": 1474328370007, "message": "hello" }, { "timestamp": 1474328302520, "message": "how are you" }, { "timestamp": 1474328370007, "message": "hello" }, { "timestamp": 1474328370007, "message": "hell

我有一个javascript对象数组,其中包含一些键和值。下面是我的数组的外观

[
{
"timestamp": 1474328370007,
"message": "hello"
},
{
"timestamp": 1474328302520,
"message": "how are you"
},
{
"timestamp": 1474328370007,
"message": "hello"
},
{
"timestamp": 1474328370007,
"message": "hello"
}
]
我想删除对象中重复出现的时间戳,并只保留该对象的单一出现。匹配应该基于时间戳而不是消息进行

预期产量为

[
{
 "timestamp": 1474328302520,
"message": "how are you"
},
{
"timestamp": 1474328370007,
"message": "hello"
}
]
试试这样的东西

var fs = require('fs');

fs.readFile("file.json", 'utf8', function (err,data) {
if (err) console.log(err);;
console.log(data);
// var result = [];
for (i=0; i<data.length;i++) {
  if(data[i].timestamp != data[i+1].timestamp)
    console.log('yes');
  }
});
var fs=require('fs');
fs.readFile(“file.json”,“utf8”,函数(err,data){
if(err)console.log(err);;
控制台日志(数据);
//var结果=[];

对于(i=0;i,可以使用对象作为哈希表并进行检查

var数组=[{“时间戳”:147432837007,“消息”:“你好”},{“时间戳”:1474328302520,“消息”:“你好”},{“时间戳”:147432837007,“消息”:“你好”},{“时间戳”:147432837007,“消息”:“你好”},
结果=数组.过滤器(函数(a){
return!this[a.timestamp]&&(this[a.timestamp]=true);
},Object.create(null));

console.log(result);
您可以使用reduce并获取唯一项

检查此代码段

var-arr=[{
“时间戳”:147432837007,
“消息”:“你好”
}, {
“时间戳”:1474328302520,
“留言”:“你好吗”
}, {
“时间戳”:147432837007,
“消息”:“你好”
}, {
“时间戳”:147432837007,
“消息”:“你好”
}];
var元素=arr.reduce(功能(先前、当前){
var object=previous.filter(object=>object.timestamp===current.timestamp);
if(object.length==0){
前推(当前);
}
返回上一个;
}, []);

console.log(elements);
一种简单的方法是使用一组标志。肯定有更好的方法,但这是一种非常简单的方法,应该适合您

数据=[
{
“时间戳”:147432837007,
“消息”:“你好”
},
{
“时间戳”:1474328302520,
“留言”:“你好吗”
},
{
“时间戳”:147432837007,
“消息”:“你好”
},
{
“时间戳”:147432837007,
“消息”:“你好”
}
];
//用于存储结果的数组
结果=[];
//商店旗帜
标志=[];

对于(i=0;i为什么使用fs.readFile读取json文件?只需要它

筛选作业本身:

const arr = require('./file.json')

const tester = []
const result = []

arr.forEach(function(el) {
  if (tester.indexOf(el.timestamp) === -1) {
    tester.push(el.timestamp)
    result.push(el)
  }
})
更新: 使用Array.prototype.reduce的优雅解决方案:

更新 在大多数情况下效率最高:

const hashmap = {};
arr.forEach(el => {
  if(!hash[el.timestamp]) hash[el.timestamp] = el;
})
const result = Object.values(hashmap);
更新 在所有情况下都是最有效和稳定的。如果哈希函数在每个情况下都会导致冲突,则上层解决方案将是非常无效的。此解决方案将是最稳定的:

const result = [];
arr.sort((a,b) => a.timestamp - b.timestamp);
arr.forEach(el => {
  const last = result[result.length-1];
  if (el.timestamp === last.timestamp) continue;
  result.push(el);
});

这真是太聪明了!@Nina谢谢你的回复。这段代码就行了。但是,我是从一个文件中提供数组的。如何对这种方法进行更改?获取错误
data.filter不是一个函数。
。我遗漏了什么?你可能遗漏了
JSON.parse(data)
?是的,很抱歉我添加了它。但是在stdout中没有任何内容。看到
['['']
@NinaThank你这个怪人。这很有帮助。你能解释一下这个代码是如何工作的吗?我无法理解这行代码在做什么:如何使用reduce来获得唯一值?这行代码做什么?
var object=previous.filter(object=>object.timestamp===current.timestamp);
返回上一个;},[])
它正在过滤已经存在的项和当前项时间戳相等的对象,这个操作符做什么?
=>
这是箭头函数,供参考,非常简单,回答很好。完全理解。谢谢
const result = [];
arr.sort((a,b) => a.timestamp - b.timestamp);
arr.forEach(el => {
  const last = result[result.length-1];
  if (el.timestamp === last.timestamp) continue;
  result.push(el);
});