根据时间戳删除数组中的“类似项”对象

时间:2018-09-13 19:06:23

标签: javascript

我有一个数组(可能不止于此),其中有一个uid和一个timestamp

我的目标是循环遍历一个对象,如果它们的uid彼此相等,则仅保留具有较大时间戳的对象。

[
  {
    "uid":"u55555",
    "timestamp":1536273731,
    "id":"8a655addf1293b6d780ff6469c0848dd",
    "name":"John Doe",
  },
  {
    "uid":"u55555",
    "timestamp":1536273831,
    "id":"8v8799817981mcmccm89c81282128cm2",
    "name":"John Doe",
  },
  {
    "uid":"u1111",
    "timestamp":1536253940,
    "id":"c8898202n2nu929n2828998228989h2h2",
    "name":"Test Testerson",
  },
  {
    "uid":"u55555",
    "timestamp":1536274940,
    "id":"fb990b1734e4aaea2e39315952e13123",
    "name":"John Doe",
  },
  {
    "uid":"u11111",
    "timestamp":1538275741,
    "id":"99s9hshs88s8g89898899898897a79s",
    "name":"Test Testerson",
  },
]

有人知道我会怎么做吗?

我一直在研究以下内容,但不能完全正确。

var result = signatures.filter(function (a) {

   //logic here

}, Object.create(null));

3 个答案:

答案 0 :(得分:3)

您可以创建一个键为guid的对象,并遍历数组,如果该项尚未存在或时间更短,则将其添加到该对象中。然后只需从该对象获取值:

let arr = [{"uid":"u55555","timestamp":1536273731,"id":"8a655addf1293b6d780ff6469c0848dd","name":"John Doe",},{"uid":"u55555","timestamp":1536273831,"id":"8v8799817981mcmccm89c81282128cm2","name":"John Doe",},{"uid":"u1111","timestamp":1536253940,"id":"c8898202n2nu929n2828998228989h2h2","name":"Test Testerson",},{"uid":"u55555","timestamp":1536274940,"id":"fb990b1734e4aaea2e39315952e13123","name":"John Doe",},{"uid":"u11111","timestamp":1538275741,"id":"99s9hshs88s8g89898899898897a79s","name":"Test Testerson",},]

let newArr = Object.values(
  arr.reduce((obj, item) => {
    if (!obj[item.uid] || obj[item.uid].timestamp < item.timestamp)
      obj[item.uid] = item
    return obj
  }, {}))
console.log(newArr)

答案 1 :(得分:3)

您可以按时间戳对原始数组进行排序,然后使用uidsort将其简化为一组唯一的reduce

var data = [{"uid": "u55555","timestamp": 1536273731,"id": "8a655addf1293b6d780ff6469c0848dd","name": "John Doe",}, { "uid": "u55555", "timestamp": 1536273831, "id": "8v8799817981mcmccm89c81282128cm2", "name": "John Doe", }, { "uid": "u1111", "timestamp": 1536253940, "id": "c8898202n2nu929n2828998228989h2h2", "name": "Test Testerson", }, { "uid": "u55555", "timestamp": 1536274940, "id": "fb990b1734e4aaea2e39315952e13123", "name": "John Doe", }, { "uid": "u11111", "timestamp": 1538275741, "id": "99s9hshs88s8g89898899898897a79s", "name": "Test Testerson", }];

var result = data
  .sort((a,b) => b.timestamp - a.timestamp) //Sort by timestamp descending
  .reduce((a,i) => a.some(n=>n.uid === i.uid) ? a : [...a, i], []); //If item is already accounted for, ignore it

console.log(result);

答案 2 :(得分:2)

您可以找到对象并检查时间戳或将实际对象添加到结果集中。

var array = [{ uid: "u55555", timestamp: 1536273731, id: "8a655addf1293b6d780ff6469c0848dd", name: "John Doe" }, { uid: "u55555", timestamp: 1536273831, id: "8v8799817981mcmccm89c81282128cm2", name: "John Doe" }, { uid: "u1111", timestamp: 1536253940, id: "c8898202n2nu929n2828998228989h2h2", name: "Test Testerson" }, { uid: "u55555", timestamp: 1536274940, id: "fb990b1734e4aaea2e39315952e13123", name: "John Doe" }, { uid: "u11111", timestamp: 1538275741, id: "99s9hshs88s8g89898899898897a79s", name: "Test Testerson" }],
    result = array.reduce((r, o) => {
        var index = r.findIndex(({ uid }) => uid === o.uid);
        if (index === -1) {
            return r.concat(o);
        }
        if (o.timestamp > r[index].timestamp) {
            r[index] = o;
        }
        return r;
    }, []);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }