2
votes

Lodash: créer un nouveau tableau avec les derniers éléments

J'ai un tableau comme ci-dessous

 [{
            "id": "002",
            "name": "A",
            "timestamp_created": "2019-02-27T11:30:19"
        },
        {
            "id": "004",
            "name": "B",
            "timestamp_created": "2019-02-27T11:05:19"
        }
    ]

Je veux créer un nouveau tableau basé sur le tableau ci-dessus, mais avec seulement le dernier élément, (grouper par nom de l'élément). p >

[{
        "id": "001",
        "name": "A",
        "timestamp_created": "2019-02-27T11:22:19"
    },
    {
        "id": "002",
        "name": "A",
        "timestamp_created": "2019-02-27T11:30:19"
    },
    {
        "id": "003",
        "name": "B",
        "timestamp_created": "2019-02-27T10:15:19"
    },
    {
        "id": "004",
        "name": "B",
        "timestamp_created": "2019-02-27T11:05:19"
    }
]

Comment combiner les différentes fonctionnalités de Lodash pour obtenir le résultat?

Toute suggestion, aidez-moi s'il vous plaît.


2 commentaires

Les deux derniers articles? Dernier élément de chaque nom Quoi?


Par exemple, le tableau a 2 éléments (A, B) mais un horodatage différent créé, je veux créer un nouveau tableau avec le dernier A et le dernier B, en fonction de l'horodatage


5 Réponses :


3
votes

Vous pouvez prendre Map code> , collectez tous les derniers éléments (en vérifiant timestamp_created ), regroupés par nom et récupérez les valeurs.

.as-console-wrapper { max-height: 100% !important; top: 0; }
var data = [{ id: "002", name: "A", timestamp_created: "2019-02-27T11:30:19" }, { id: "003", name: "B", timestamp_created: "2019-02-27T10:15:19" }, { id: "004", name: "B", timestamp_created: "2019-02-27T11:05:19" }, { id: "001", name: "A", timestamp_created: "2019-02-27T11:22:19" }],
    result = Array.from(data
        .reduce(
            (m, o) => m.has(o.name) && m.get(o.name).timestamp_created > o.timestamp_created
               ? m
               : m.set(o.name, o),
            new Map
        )
        .values()
    );
    
console.log(result);


2 commentaires

la quantité d'effort de sauvegarde de personnage cependant: D


Je l'appelle le facteur Nina;)



2
votes

Sans utiliser la bibliothèque lodash , vous pouvez générer le résultat en utilisant Array.reduce () :

.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}
const input = [
    {
        "id": "001",
        "name": "A",
        "timestamp_created": "2019-02-27T11:22:19"
    },
    {
        "id": "002",
        "name": "A",
        "timestamp_created": "2019-02-27T11:30:19"
    },
    {
        "id": "003",
        "name": "B",
        "timestamp_created": "2019-02-27T10:15:19"
    },
    {
        "id": "004",
        "name": "B",
        "timestamp_created": "2019-02-27T11:05:19"
    }
];

let res = input.reduce((acc, {id, name, timestamp_created}) =>
{
    acc[name] = acc[name] || {id, name, timestamp_created};
    
    if (acc[name].timestamp_created < timestamp_created)
        acc[name] = {id, name, timestamp_created};    

    return acc;
}, {});

console.log(Object.values(res));


0 commentaires

2
votes

Si vous souhaitez utiliser lodash, cela fera l'affaire.

function latestItems(original) {
    filtered = [];
    grouped = _.groupBy(original, "name");
    _.forEach(grouped, function (group) {
        newest = {
            "timestamp_created": "0"
        };
        _.forEach(group, function (item) {
            if (item.timestamp_created > newest.timestamp_created) {
                newest = item;
            }
        });
        filtered.push(newest);
    });

    return filtered;
}


1 commentaires

Pour répondre à la question, ceux-ci ont besoin de codes et de scripts, une description du fonctionnement du code écrit doit être utile.



2
votes

Excellentes réponses jusqu'à présent. Comme OP a demandé une solution Lodash, voici que:

const data = [{
    "id": "001",
    "name": "A",
    "timestamp_created": "2019-02-27T11:22:19"
},
{
    "id": "002",
    "name": "A",
    "timestamp_created": "2019-02-27T11:30:19"
},
{
    "id": "003",
    "name": "B",
    "timestamp_created": "2019-02-27T10:15:19"
},
{
    "id": "004",
    "name": "B",
    "timestamp_created": "2019-02-27T11:05:19"
}
];

const reduceFunction = (acc, val) => {
    if (val.name in acc) {
        if (val.timestamp_created > acc[val.name].timestamp_created) {
            acc[val.name] = val
        }
    } else {
        acc[val.name] = val
    }

    return acc;
};

const filteredData = _.values(
    _.reduce(data, reduceFunction, {})
);


0 commentaires

2
votes

Solution courte utilisant lodash

const data = [...]
const result = _(data)
  .groupBy('name')
  .map(group => _.maxBy(group, 'timestamp_created'))
  .value()

Utilisez groupBy pour regrouper par nom . Ensuite, utilisez maxBy pour obtenir un objet qui a max timestamp_created.

_.maxBy (tableau, [iteratee = _. identity])

Cette méthode est similaire à _.max sauf qu'elle accepte iteratee qui est invoquée pour chaque élément du tableau pour générer le critère selon lequel la valeur est classée. L'itération est appelée avec un argument: (valeur).

https://lodash.com/docs/4.17.11#maxBy


0 commentaires