La imagen global es que estoy tratando de eliminar duplicados de una matriz de objetos. Los objetos con el mismo advertId y leadboxId se consideran duplicados, pero para fines de prueba solo estoy verificando advertIds

Estoy obteniendo esta matriz de sessionStorage y eliminando duplicados.

var testSort = function () {
    var events = [];
    events = sessionStorage.events;
    console.log("events unsorted");
    console.log(events);
    for (var i = 0; i < events.length; i++) {
        for (var x = i + 1; x < events.length; x++) {
            if (events[x].advertId == events[i].advertId) {
                events.splice(x, 1);
                --x;
            }
        }
        // add
    }

La consola imprime la matriz de eventos como tal:

[{"module":"slick_module","eventType":"swipe","leadboxId":"1565","advertId":"5653","length":"length of event","time":1462783354789,"posted":"postedStatus"},{"module":"slick_module","eventType":"swipe","leadboxId":"1565","advertId":"56527","length":"length of event","time":1462783357590,"posted":"postedStatus"}]

¿No es esta una buena variedad? Al intentar empalmar esto, aparece el error de que events.splice no es una función.

Cualquier ayuda es apreciada.

0
JSB 9 may. 2016 a las 11:47

3 respuestas

La mejor respuesta

No puede almacenar una matriz / objeto en SessionStorage .
El almacenamiento web solo puede almacenar cadenas.
Tiene una cadena en la clave sessionStorage['events'], procesada mediante el método JSON.stringify().
Para manejar la matriz para un mayor filtrado - decodifique esa cadena con el método JSON.parse() como:

var arr = JSON.parse(sessionStorage['events']);
...

https://developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API/Using_the_Web_Storage_API

1
RomanPerekhrest 9 may. 2016 a las 09:24

Puede usar Array#filter con una tabla hash para elementos ya insertados.

var array = [{ "module": "slick_module", "eventType": "swipe", "leadboxId": "1565", "advertId": "5653", "length": "length of event", "time": 1462783354789, "posted": "postedStatus" }, { "module": "slick_module", "eventType": "swipe", "leadboxId": "1565", "advertId": "56527", "length": "length of event", "time": 1462783357590, "posted": "postedStatus" }, { "module": "slick_module", "eventType": "swipe", "leadboxId": "1565", "advertId": "56527", "length": "length of event", "time": 1462783357590, "posted": "postedStatus" }],
    filtered = array.filter(function (a) {
        var key = a.leadboxId + '|' + a.advertId;
        if (!this[key]) {
            this[key] = true;
            return true;
        }
    }, Object.create(null));

document.write('<pre>' + JSON.stringify(filtered, 0, 4) + '</pre>');
1
Nina Scholz 9 may. 2016 a las 08:55

Como siempre Array.prototype.reduce() para ayudar con un solo revestimiento

var events = [{"module":"slick_module","eventType":"swipe","leadboxId":"1565","advertId":"5653","length":"length of event","time":1462783354789,"posted":"postedStatus"},{"module":"slick_module","eventType":"swipe","leadboxId":"1565","advertId":"56527","length":"length of event","time":1462783357590,"posted":"postedStatus"}],
  filtered = events.reduce((p,c) => !~p.findIndex(e => e.advertId == c.advertId) ? p.concat(c) : p, []);
document.write("<pre>" +  JSON.stringify(filtered, null,2) + "</pre>");
0
Redu 9 may. 2016 a las 09:24